繁体   English   中英

使用给定的第一个和最后一个迭代器在范围内进行迭代

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM