c – “除了最后一个之外的每个”(或“每个连续元素对之间”)的成语

参见英文答案 > 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;
}
上一篇:如何在python中从文件中读取自定义分隔符终止的记录?


下一篇:delphi字符串分隔函数用法实例