每个人都会在某个时候遇到这个问题:
for(const auto& item : items) {
cout << item << separator;
}
... 而且你会在结尾得到一个不想要的额外分隔符。有时它不会打印出来,而是执行其他一些动作,但是这些相同类型的连续动作需要某些分隔符动作 - 但最后一个不需要。
现在,如果您使用旧式for循环和数组,您将执行以下操作
for(int i = 0; i < num_items; i++)
cout << items[i];
if (i < num_items - 1) { cout << separator; }
}
(或者您可以将循环中的最后一个项目作为特例处理。)如果您有任何支持非破坏性迭代器的东西,即使您不知道其大小,也可以执行以下操作:
for(auto it = items.cbegin(); it != items.cend(); it++) {
cout << *it;
if (std::next(it) != items.cend()) { cout << separator; }
}
我不喜欢最后两种方法的审美效果,更喜欢使用范围for循环。是否可以使用更加时髦的C++11构造实现相同的效果?
为了进一步扩展问题(超出这个问题的范围),我想说我也不想明确地设置第一个或最后一个元素的特殊情况。这是我不想被困扰的“实现细节”。那么,在想象中的未来的C ++中,应该像这样做:
for(const auto& item : items) {
cout << item;
} and_between {
cout << separator;
}
fold
不会帮助你 - 它将对每个元素应用操作,包括第一个和最后一个。 - SergeyAstd::accumulate
,但一个元素应该没问题(这个单独的元素被作为init
传递,而且最初begin == end
,导致没有折叠)。 - Ben Voigt