2010-09-27 2 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

К сожалению, ответа нет. –

+0

Возможный дубликат [Печать списков с запятыми C++] (http://stackoverflow.com/questions/3496982/printing-lists-with-commas-c) Назовите меня предвзятым, если вы (в конце концов, я), но я думаю, мой ответ на этот вопрос особенно чист ... :-) –

+0

Я имею в виду, вы можете делать фанковые вещи с помощью 'transform' или' accumulate', но они будут включать использование функторов. Вам не нужно писать цикл, но вам придется писать код. –

ответ

5

Хотя не с станд:

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

EDIT: Нет проблем:

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

Хорошее решение, но вы должны указать, что он работает только со списками 'string' (или' string'-convertable objects), в то время как 'ostream_iterator' может иметь дело с чем-либо, с чем сталкивается' cout'. Приобретено. – ereOn

+0

@ereOn: обновлено. – ybungalobill

Смежные вопросы