2

我有一段这样的代码:

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

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

4

4 回答 4

4

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

于 2012-11-21T14:02:01.260 回答
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;
    }
}
于 2012-11-21T14:04:12.447 回答
0

在 STL 中,有一个不包含值的最后一个迭代器,因此您的循环将在这种情况下工作。

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

于 2012-11-21T14:01:47.520 回答
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 << ", ";
}

但请注意,如果end由 STL 库(如list.end())给出,它已经是最后一个元素之后的值,并且++会引发异常。

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

于 2012-11-21T14:04:09.510 回答