从C ++输出中去除逗号从C ++输出中去除逗号(Removing a comma from a c

2019-05-12 11:10发布

我写了这个程序,在从最大到最小矢量排序号,它的伟大工程,但被窃听我的唯一事情就是试图从最后一个数字删除逗号。 我的继承人代码

#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后看到有一个逗号这没有意义语法讲话。 我怎样才能删除逗号?

Answer 1:

而不是删除最简单的方法是刚刚打印逗号仅比第一其它值:

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

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

下面是伪代码的通用变种:

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


Answer 2:

如果beginend至少双向迭代器(和你的),你可以检查最初是begin != end ; 如果不打印什么; 如果是这样打印", " -puncuated元素递增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> 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]

生活



文章来源: Removing a comma from a c++ output