gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:32:26 27 4
gpt4 key购买 nike

我用这样的原型(prototype)编写了一些函数:

template <typename input_iterator>
int parse_integer(input_iterator &begin, input_iterator end);

这个想法是调用者将提供一系列字符,该函数会将字符解释为整数值并返回它,将 begin 留在最后使用的字符之后。例如:

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);

这将使 i 设置为 123 并且 p “指向” foo 之前的空间。

我被告知(没有解释)通过引用传递迭代器是一种不好的形式。是不是形式不好?如果有,为什么?

最佳答案

确实没有什么问题,但肯定会限制模板的使用。你不能只放一个由其他东西返回的迭代器,或者像 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);
}

另一种选择是有一个输出迭代器,其中将写入数字:

template<typename input_iterator, typename output_iterator>
input_iterator parse_integer(input_iterator begin, input_iterator end,
output_iterator out);

您将有返回值来返回新的输入迭代器。然后,如果您已经知道数字的数量,您可以使用插入器迭代器将解析后的数字放入 vector 或指针中,将它们直接放入整数或数组中。

int i;
b = parse_integer(b, end, &i);

std::vector<int> numbers;
b = parse_integer(b, end, std::back_inserter(numbers));

关于c++ - 通过引用传递 C++ 迭代器有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com