通过引用传递C++迭代器有什么问题?

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)

  • "你不可能只是把一个迭代器放回别的东西或像v.begin()一样生成,因为那些将是临时的." 这就是C++ 0x右值引用的用途.:) (2认同)

Reu*_*nen 5

一般来说:

如果你传递一个非const引用,调用者不知道迭代器是否被修改。

您可以传递一个const引用,但通常迭代器足够小,与按值传递相比没有任何优势。

在你的情况下:

我不认为你所做的有什么问题,除了它在迭代器的使用方面不是太标准。