2010-09-27 50 views
3

通常情况下,当我不得不显示分隔字符串列表,我在做这样的事情:如何很好地输出分隔字符串的列表?

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, 

近乎完美,除了额外的,。是否有一种优雅的方式来处理特殊的“第一个(或最后一个)元素案例”,并且具有与第一个代码相同的输出,而没有其“复杂性”?

+0

很遗憾,答案是否定的。 – 2010-09-27 13:27:41

+0

[用逗号打印列表C++]可能的重复(http://stackoverflow.com/questions/3496982/printing-lists-with-commas-c)如果你会(我毕竟是),打电话给我偏见,但我认为我对这个问题的回答特别干净...... :-) – 2010-09-27 13:28:20

+0

我的意思是,你可以用'transform'或'accumulate'做些时髦的事情,但那些会涉及到使用函子。你不必编写一个循环,但你必须编写代码。 – 2010-09-27 13:28:36

回答

5

虽然不是性病:

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

编辑:没问题:

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

不错的解决方案,但是您应该指出它只适用于'string'(或'string'-convertable对象)的列表,而'ostream_iterator'可以处理任何'cout'处理的东西。尽管如此。 – ereOn 2010-09-27 13:35:48

+0

@ereOn:已更新。 – ybungalobill 2010-09-27 13:44:48