【发布时间】:2012-08-25 09:13:24
【问题描述】:
给出最小的 C++11 STL 示例:
set<int> S = {1,2,3,4};
for(auto &x: S) {
cout << x;
cout << ",";
}
有没有办法检查 x 是否是结束前的那个?此示例中的目标是输出1,2,3,4,而不是最后的逗号。目前我使用带有两个迭代器的标准 for 循环,
set<int>::const_iterator itr;
set<int>::const_iterator penultimate_end_itr = --S.end();
for(itr=S.begin(); itr!=penultimate_end_itr;++itr)
cout << (*itr) << ',';
cout << (*penultimate_end_itr);
这很有效,但非常麻烦。有没有办法在基于范围的 for 循环中进行检查?
编辑:问题的重点是不是打印出逗号分隔的列表。我想知道基于范围的 for 循环是否对列表中的倒数第二个元素有任何了解(即它是否在结束前一个)。给出了最小的例子,所以我们都有一个共同的代码块可以讨论。
【问题讨论】:
-
没有优雅的方法可以解决这个问题。将丑陋隐藏在函数中并继续前进。
-
@Shmiddty 不完全是,我使用示例作为输入,但我的问题是关于访问基于范围的 for 循环,以及它们对容器末尾的感知。
-
这个特定问题已经用infix_ostream_iterator解决得更干净了。
copy(begin(S), end(S), infix_ostream_iterator<int>(cout, ","));。然而,就核心问题而言,我相信正确的答案很简短:“不”。 -
你不能在右值上便携地调用
--。使用std::prev。