C++ 函数中输出容器默认值的开始
我有以下减速功能:C++ 函数中输出容器默认值的开始,c++,c++11,iterator,optional-parameters,C++,C++11,Iterator,Optional Parameters,我有以下减速功能: template<class Tinput_iterator, class Toutput_iterator> int foo(const Tinput_iterator& begin_input, const Tinput_iterator& end_input, Toutput_iterator& begin_output); 编辑: 如果begin\u output是这样传递的,例如: std::vector<int>
template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input, const Tinput_iterator& end_input, Toutput_iterator& begin_output);
编辑:
如果begin\u output
是这样传递的,例如:
std::vector<int> bar(data.size());
auto result=foo(begin(data),end(data),begin(bar));
结果
将包含一个整数
(同上)
当然,没有
条
,也不会存储任何内容最明显的解决方案是使用默认构造的迭代器作为默认值
模板
int foo(Tinput迭代器开始输入,Tinput迭代器结束输入,Toutput迭代器开始输出={});
顺便说一下,这一切都取决于Toutput\u迭代器的定义方式。如果迭代器是按照标准库迭代器的思路设计的,那就好了。它也适用于指针(默认值为nullptr
)
注意,我已经从foo
的参数声明中删除了引用。这是因为迭代器通常设计为按值传递。另一个选项是重载foo
:
template<class Tinput_iterator>
int foo(const Tinput_iterator& begin_input,
const Tinput_iterator& end_input) {}
template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input,
const Tinput_iterator& end_input, Toutput_iterator& begin_output) {}
模板
int foo(常量输入迭代器&开始输入,
常量Tinput_迭代器和end_输入{}
模板
int foo(常量输入迭代器&开始输入,
常量Tinput_迭代器和end_输入,Toutput_迭代器和begin_输出{}
我认为这取决于foo
的功能以及如何使用默认值。你能提供更多细节吗?我非常怀疑通过引用const来设置开始和结束迭代器是否是一个好主意。我认为通过值传递它们更合适,因为您无论如何都要复制begin。@TartanLlama我已经编辑了我的question@ArmenTsirunyan这只是一个习惯,通过每件事使用常数&。。你能告诉我这里的问题是什么吗?顺便说一句,我认为这是std算法中使用的方法(至少在我的编译器实现它的时候)。你认为出于某种原因它更受欢迎吗?@HumamHelfawi此方法对迭代器实现免疫。对于某些迭代器,it={}
将不起作用。您必须指定当前某处的Toutput\u迭代器的类型…:-/@Jarod42抱歉,我无法理解foo(c.begin(),c.end())
,这是begin\u输出的类型(无法推断)。@PaoloM我忘了问你,在函数体中如何检查迭代器是否未传递,是否有默认值?thanks@HumamHelfawi只需对照Toutput_迭代器def_value{}
auto result=foo(begin(data),end(data)/*,begin(bar)*/);
template<class Tinput_iterator, class Toutput_iterator = void*>
int foo(Tinput_iterator begin_input, Tinput_iterator end_input, Toutput_iterator begin_output = {});
template<class Tinput_iterator>
int foo(const Tinput_iterator& begin_input,
const Tinput_iterator& end_input) {}
template<class Tinput_iterator, class Toutput_iterator>
int foo(const Tinput_iterator& begin_input,
const Tinput_iterator& end_input, Toutput_iterator& begin_output) {}