从 c++ 输出中删除逗号

Removing a comma from a c++ output

本文关键字:删除 c++ 输出      更新时间:2023-10-16

我编写了这个程序,该程序从最大到最小对向量中的数字进行排序,它工作得很好,但唯一困扰我的是试图从最后一个数字中删除逗号。这是我的代码

#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main() {
    vector<int> vi1, vi2, vi3;
    srand(987);
    for (int i = 0; i < 10; ++i) vi1.push_back(rand() % 10);
    sort(vi1.begin(), vi1.end());
    for (int i = 0; i < 10; ++i) vi2.push_back(rand() % 10);
    sort(vi2.begin(), vi2.end())
    while(!vi1.empty() && !vi2.empty()) {
        if(vi1.back()>=vi2.back()) {
            vi3.push_back(vi1.back());
            vi1.pop_back();
        }
        else {
            vi3.push_back(vi2.back());
            vi2.pop_back();
        }
    }
    while(!vi1.empty()) {
        vi3.push_back(vi1.back());
        vi1.pop_back();
    }
    while(!vi2.empty()) {
        vi3.push_back(vi2.back());
        vi2.pop_back();
    }
    for (auto i = vi3.begin(); i != vi3.end(); ++i)
        cout << *i << ", ";
    cout << "nBye..." << endl;
    return 0;
}

这是输出

9, 9, 9, 8, 8, 8, 6, 6, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 
Bye...

正如您在最后一个 0 之后看到的,有一个逗号在语法上没有意义。如何删除该逗号?

而不是删除最简单的方法只是只为第一个值以外的其他值打印逗号:

for (auto i = vi3.begin(); i != vi3.end(); ++i) {
    if(i != vi3.begin()) {
        cout << ", ";
    }
    cout << *i;
}

我经常使用这个成语来格式化例如.SQL参数列表,或者类似的格式,在最后一个元素之后不需要分隔符,而是任何其他元素。
还有其他方法可以检测第一个元素(例如,使用在循环开始之前初始化为truebool变量,并在第一次迭代时设置为false(。
对于您的示例,似乎只是检查vi3.begin()是最简单,最自然的方法。

下面是伪代码中的通用变体:

bool isFirstOutput = true;
for_each(element in list) {
    if(not isFirstOutput) {
        print delimiter;
    }
    print element;
    isFirstOutput = false;
}

如果beginend至少是双向迭代器(就像你的一样(,您可以先检查begin != end ; 如果不打印任何内容;如果是这样,请打印 ", "点状元素递增begin != std::prev(end),以及最后打印*begin() .这样:

主.cpp

#include <utility>
template<typename OStream, typename BiIter, typename Punct>
void punctuated(OStream && out, Punct && punct, BiIter begin, BiIter end)
{
    if (begin != end) {
        for (--end  ;begin != end; ++begin) {
            std::forward<OStream>(out) << *begin << std::forward<Punct>(punct);
        }
        std::forward<OStream>(out) << *begin;
    }
}
#include <iostream>
#include <vector>
#include <list>
#include <set>
int main()
{
    std::vector<int> v0;
    std::vector<int> v1{{1}};
    std::list<int> l{{1,2}};
    std::set<int>s{{3,4,5,6,7}};
    std::cout << "v0 [";
    punctuated(std::cout,",",v0.begin(),v0.end());
    std::cout << "]n";
    std::cout << "v1 [";
    punctuated(std::cout,",",v1.begin(),v1.end());
    std::cout << "]n";
    std::cout << "l [";
    punctuated(std::cout,",",l.begin(),l.end());
    std::cout << "]n";
    std::cout << "s [";
    punctuated(std::cout,"|",s.begin(),s.end());
    std::cout << "]n";
    return 0;
}

输出:

g++ -Wall -Wextra main.cpp && ./a.out
v0 []
v1 [1]
l [1,2]
s [3|4|5|6|7]