[英]Iterate over range with given first and last iterator
我得到了一段这样的代码:
template<class Iter>
void printRange(Iter begin, Iter last) {
for (Iter i = begin; i != last; i++) {
std::cout << *i << ", ";
}
outstd::cout << *last << ", ";
}
我的问题是:我如何也可以优雅地打印出最后一个元素? 循环后逐个处理最后一个元素似乎不是一个不错且正确的解决方案,...有更好的方法吗? 请注意,我也不能使用<=运算符或boost或任何stl特定功能。
对于STL容器类,迭代器值到底是最后一个项目之后 。 一旦结束 ,它可以退出,因为所有项目均已处理。
您可以有条件地输出分隔符:
template<class Iter>
void printContainer(Iter first, Iter last) {
for (Iter i = first, end = ++last; i != end; i++) {
std::cout << (i == first ? "" : ", ") << *i;
}
}
对于更标准的[begin, end)
半开范围:
template<class Iter>
void printContainer(Iter begin, Iter end) {
for (Iter i = begin; i != end; i++) {
std::cout << (i == begin ? "" : ", ") << *i;
}
}
在STL中,有一个最后一个没有值的迭代器,因此您的循环在这种情况下可以工作。
也许您应该考虑在列表的末尾添加另一个不包含任何值的迭代器,以便与STL保持一致。
你可以做:
template<class Iter>
void printContainer(Iter begin, Iter last) {
Iter afterEnd = end;
afterEnd++;
for (Iter i = begin; i != afterEnd; i++) {
std::cout << *i << ", ";
}
outstd::cout << *last << ", ";
}
但是请注意,如果end
由STL库(例如list.end()
)给出,则它已经是最后一个元素之后的值,而++
将引发异常。
所以我会以现有的方式使用现有的代码。 但是当我调用它时,我将它传递给我要打印的最后一个值之后的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.