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

时间:2012-11-21 13:58:48

标签: c++ iterator containers

我得到了一段这样的代码:

template<class Iter>
void printRange(Iter begin, Iter last) {
    for (Iter i = begin; i != last; i++) {
        std::cout << *i << ", ";
    }
     outstd::cout << *last << ", ";
}

我的问题是:我怎样才能优雅地打印出最后一个元素?在循环之后单独调出最后一个元素似乎不是一个好的和正确的解决方案,...有更好的方法吗?请注意,我不能使用&lt; =运算符或boost或任何stl特定功能。

4 个答案:

答案 0 :(得分:4)

对于STL容器类,迭代器值 end 在最后一项之后是。到达 end 后,它就可以退出,因为所有项目都已处理完毕。

答案 1 :(得分:2)

您可以有条件地输出分隔符:

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

答案 2 :(得分:0)

在STL中,有一个最后一个没有值的迭代器,所以你的循环在这种情况下会起作用。

也许您应该考虑在列表末尾添加另一个不包含任何值的迭代器,这样您就可以与STL保持一致。

答案 3 :(得分:0)

你可以这样做:

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 << ", ";
}

但请注意,如果STL libs(如end)给出list.end(),则它已经是最后一个元素之后的值,而++将抛出异常。

所以我会按照你拥有的方式使用你拥有的代码。但是当我调用它时,我将它传递给我想要打印的最后一个值之后的值。