如何优雅地输出一个由分隔字符串组成的列表?

4
通常情况下,当我需要显示一个分隔字符串列表时,我会做类似以下的事情:
using namespace std;
vector<string> mylist; // Lets consider it has 3 elements : apple, banana and orange.

for (vector<string>::iterator item = mylist.begin(); item != mylist.end(); ++item)
{
  if (item == mylist.begin())
  {
    cout << *item;
  } else
  {
    cout << ", " << *item;
  }
}

这将输出:

apple, banana, orange

我最近发现了std::ostream_iterator,觉得使用起来非常方便。

但是使用以下代码时:

copy(mylist.begin(), mylist.end(), ostream_iterator<string>(cout, ", "));

如果获取到:
apple, banana, orange, 

除了多余的,之外,几乎完美。有没有一种优雅的方式来处理特殊的“第一个(或最后一个)元素情况”,并且使输出与第一个代码相同,但不具有其“复杂性”?


遗憾的是,答案是否定的。 - John Dibling
可能是在C++中使用逗号打印列表的重复问题。如果你愿意,可以称呼我有偏见(毕竟,我确实有),但我认为我对那个问题的回答特别简洁... :-) - Jerry Coffin
我的意思是,你可以使用transform或者accumulate做一些有趣的事情,但这需要使用functors。你不必写一个循环,但你必须编写代码。 - John Dibling
1个回答

5

尽管不使用标准库:

cout << boost::algorithm::join(mylist, ", ");

EDIT: No problem:

cout << boost::algorithm::join(mylist | 
    boost::adaptors::transformed(boost::lexical_cast<string,int>), ", "
);

不错的解决方案,但你应该指出它只适用于string列表(或可转换为string的对象),而ostream_iterator可以处理cout能处理的任何东西。尽管如此,我还是点了赞。 - ereOn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接