Как я могу преобразовать список целых чисел в строку, разделенную запятыми?

В настоящее время я внедряю новое программное обеспечение. При анализе файла я собираю список номеров строк, которые были пропущены. После синтаксического анализа я хотел бы вывести все номера строк в виде строки, разделенной запятыми.

Как преобразовать std::list<int> в std::string список, разделенный запятыми?

Предположим, что этот сегмент кода является фреймворком:

#include <list>
#include <string>

void parseFile()
{
    std::list<int> skippedLines;
    // ...parse file...
    if (!skippedLines.empty()) {
        const std::string skippedLinesAsString = ???
        log << "Skipped lines: " << skippedLinesAsString;
    }
}

Обратите внимание, в результате мне нужен std::string. Показанный поток предназначен только для иллюстрации и не может использоваться для вывода.

Я реализовал это традиционным способом, используя цикл. Но я уверен, что есть простое алгоритмическое решение с использованием обратного вставки или подобного.


person Flovdis    schedule 20.08.2015    source источник
comment
@Yakk На самом деле я использую QList<int>, который совместим со стандартной библиотекой.   -  person Flovdis    schedule 20.08.2015
comment
Я бы придерживался цикла записи в строковый поток, потому что он легко читается и удобен в сопровождении. Вы также можете посмотреть на boost, в котором есть много хороших инструментов.   -  person Serge Ballesta    schedule 20.08.2015
comment
en.cppreference.com/w/cpp/experimental/ostream_joiner представляет интерес -- в C++1z вы можете взять sstream, создать соединение, скопировать содержимое через средство соединения, а затем получить строку из sstream.   -  person Yakk - Adam Nevraumont    schedule 20.08.2015


Ответы (1)


Удивительно, но для этого нет хорошего алгоритмического решения. Общим решением будет использование std::stringstream и ostream_iterator следующим образом:

std::ostringstream str;
std::copy(l.begin(), l.end(), std::ostream_iterator(str, ", ");

Проблема в том, что в этом случае последний элемент в строке будет заканчиваться разделителем ', '. Так что вам придется сделать это в цикле, если вы хотите правильную строку.

Вы также можете создать что-то вроде std::accumulate и lambda, но, честно говоря, цикл будет намного читабельнее.

person SergeyA    schedule 20.08.2015