元素之间的输出逗号

时间:2012-06-16 13:17:11

标签: c++ performance coding-style

我的问题类似于this one,但我不想为此使用库。

想象一下,我们有一个我们想要输出的名字数组。

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i];
}

输出:PeterMaxJackDanielLuke

这不是我们称之为用户友好的,所以让我们在名称之间输出逗号。

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i] << ", ";
}

输出:Peter, Max, Jack, Daniel, Luke,

问题是结尾逗号。使用if我可以检查for的每个循环,如果它是最后一个元素,但这似乎不是一个干净的解决方案。

在不使用库的情况下在元素之间插入逗号的最佳方法是什么?

4 个答案:

答案 0 :(得分:5)

首先,代码中存在错误,sizeof(names)会产生错误的值。

要将逗号放在正确的位置,常规方法如下:

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };
bool first = true;

for(auto const& name : names) {
    if (first)
        first = false;
    else
        cout << ", ";
    cout << name;
}

或者,如果您不使用C ++ 11:

for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); ++i) {
    if (i > 0)
        cout << ", ";
    cout << names[i];
}

但是这个:

  

在不使用库的情况下在元素之间插入逗号的最佳方法是什么?

是错误的态度。只有在使用库时,C ++才能正常工作。没有库,C ++是一种糟糕的语言。或者,用Stroustrup的话说:

  

如果没有一个好的库,大多数有趣的任务在C ++中很难做到;但是如果有一个好的图书馆,几乎任何任务都可以轻松完成。

答案 1 :(得分:4)

使用boost::join

std::cout << boost::join(names, ", ") << "\n";

因为重写函数没有意义......虽然它当然很简单。

答案 2 :(得分:2)

为什么不简单:

string names[] = { "Peter", "Max", "Jack", "Daniel", "Luke" };
int i;

for (i = 0; i < sizeof(names) / sizeof(names[0]) - 1; i++)
{
    cout << names[i] << ", "; 
}   
cout << names[i];

这就是我通常做的事情。

答案 3 :(得分:1)

这不是一个干净的解决方案,但它是唯一的解决方案。

for(int i = 0; i < sizeof(names); i++)
{
    cout << names[i] << (i==sizeof(names)-1)?"",", ";
}