从C ++输出中删除逗号

时间:2019-04-17 20:20:35

标签: c++ vector iostream

我写了这个程序,它从最大到最小对向量中的数字进行排序,虽然效果很好,但是困扰我的唯一一件事就是试图从最后一个数字中删除逗号。这是我的代码

#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后有一个逗号,语法上没有意义。如何删除该逗号?

2 个答案:

答案 0 :(得分:6)

除了删除之外,最简单的方法是仅打印除第一个值以外的其他值的逗号:

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

我经常使用这个习惯用法来格式化例如SQL参数列表,或类似的参数,在最后一个元素之后不希望使用定界符,但对于其他任何元素都不需要定界符。
还有其他方法可以检测 first元素(例如,在循环开始之前使用初始化为bool的{​​{1}}变量,并在第一次迭代时将其设置为true )。
对于您的示例,似乎只检查false是最简单,最自然的方法。

这是伪代码中的通用变体:

vi3.begin()

答案 1 :(得分:0)

如果beginend至少是双向迭代器(与您一样), 您可以最初检查begin!= end;如果不打印什么;如果这样打印 ", "个穿孔元素使begin != std::prev(end)递增,并且 最后打印*begin()。像这样:

main.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> v1g++ -Wall -Wextra main.cpp && ./a.out
v0 []
v1 [1]
l [1,2]
s [3|4|5|6|7]
;
    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;
}

输出:

 For Each element As String In File.ReadAllLines("test.txt")
 console.writeline(element)
 next

Live