Adr*_*thy 40 c++ iterator pass-by-reference
我用这样的原型编写了一些函数:
template <typename input_iterator>
int parse_integer(input_iterator &begin, input_iterator end);
Run Code Online (Sandbox Code Playgroud)
这个想法是调用者将提供一系列字符,并且该函数会将字符解释为整数值并将其返回,从最后使用的字符开始.例如:
std::string sample_text("123 foo bar");
std::string::const_iterator p(sample_text.begin());
std::string::const_iterator end(sample_text.end());
int i = parse_integer(p, end);
Run Code Online (Sandbox Code Playgroud)
这将begin设置为123并i"指向"之前的空间p.
我被告知(没有解释)通过引用传递迭代器是不好的形式.这是不好的形式?如果是这样,为什么?
Joh*_*itb 32
没有什么是错的,但肯定会限制模板的使用.你将不能只是把一个迭代器放回别的东西或生成像v.begin(),因为那些将是临时的.你将始终首先制作一个本地副本,这是一种不太好的样板文件.
一种方法是超载它:
int parse_integer(input_iterator begin, input_iterator end,
input_iterator &newbegin);
template<typename input_iterator>
int parse_integer(input_iterator begin, input_iterator end) {
return parse_integer(begin, end, begin);
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是有一个输出迭代器,其中的数字将被写入:
template<typename input_iterator, typename output_iterator>
input_iterator parse_integer(input_iterator begin, input_iterator end,
output_iterator out);
Run Code Online (Sandbox Code Playgroud)
您将返回值以返回新的输入迭代器.然后,您可以使用插入器迭代器将已解析的数字放入向量或指针中,以便在已知数字量的情况下将它们直接放入整数或数组中.
int i;
b = parse_integer(b, end, &i);
std::vector<int> numbers;
b = parse_integer(b, end, std::back_inserter(numbers));
Run Code Online (Sandbox Code Playgroud)
一般来说:
如果你传递一个非const引用,调用者不知道迭代器是否被修改。
您可以传递一个const引用,但通常迭代器足够小,与按值传递相比没有任何优势。
在你的情况下:
我不认为你所做的有什么问题,除了它在迭代器的使用方面不是太标准。