参见英文答案 > Printing lists with commas C++ 24个
> How can I check if I’m on the last element when iterating using foreach syntax 6个
每个人都会遇到这个问题:
for(const auto& item : items) {
cout << item << separator;
}
…而且你得到了一个你不想要的额外分隔符.有时候它不是打印,而是执行一些其他动作,但是相同类型的连续动作需要一些分隔符动作 – 但最后一个动作不需要.
现在,如果你使用old-school 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; }
}
我不喜欢最后两个的美学,并喜欢一系列的循环.我可以获得与最后两个相同的效果,但使用更多漂亮的C 11ish结构吗?
为了进一步扩展这个问题(超出,比如说,this one),我会说我也不想明确地说明第一个或最后一个元素的特殊情况.这是一个“实施细节”,我不想被打扰.所以,在想象中的未来-C中,可能是这样的:
for(const auto& item : items) {
cout << item;
} and_between {
cout << separator;
}
解决方法:
我的方式(没有额外的分支)是:
const auto separator = "WhatYouWantHere";
const auto* sep = "";
for(const auto& item : items) {
std::cout << sep << item;
sep = separator;
}