Russian Qt Forum

Программирование => С/C++ => Тема начата: iks от Апреля 23, 2011, 11:07



Название: Конвертировать list<string> в string [решено]
Отправлено: iks от Апреля 23, 2011, 11:07
Есть список строк
Код:
list<string> lst;
lst.push_back("первая");
lst.push_back("вторая");
lst.push_back("третья");
надо из него получить строку такого типа
Код:
string str = "первая|вторая|третья";
можно конечно запустить циклом, но хотелось бы проще


Название: Re: Конвертировать list<string> в string
Отправлено: alexman от Апреля 23, 2011, 11:11
Не знаю как в stl, а в Qt есть метод QString QStringList::join ( const QString & separator ) const


Название: Re: Конвертировать list<string> в string
Отправлено: iks от Апреля 23, 2011, 11:16
вопрос задан не по Qt а именно по c++ это в cgi используется


Название: Re: Конвертировать list<string> в string
Отправлено: Igors от Апреля 23, 2011, 11:34
можно конечно запустить циклом, но хотелось бы проще
Если Вы и найдете что-то "ну очень крутое" (чтобы все-таки записать 1 строку вместо 2 с циклом), то это будет только в минус. Хотя бы потому что так Вы заставляете всех читающих знать эту "крутизну". Ни к чему это.


Название: Re: Конвертировать list<string> в string
Отправлено: iks от Апреля 23, 2011, 12:41
Если Вы и найдете что-то "ну очень крутое" (чтобы все-таки записать 1 строку вместо 2 с циклом), то это будет только в минус. Хотя бы потому что так Вы заставляете всех читающих знать эту "крутизну". Ни к чему это.
Ну в то время когда один бегал с каменным топором и говорил что это хорошо и лудше ни чего быть не может, другой в это время нашел руду и попробовал из нее сделать себе топор, и он почему-то вышел лудше чем каменный.
-------
Думаю ответ понятен.
==================================
А теперь о том что я нашел
Код:
list<string> lst;
lst.push_back("первая");
lst.push_back("вторая");
lst.push_back("третья");

ostringstream st;
copy(lst.begin(), lst.end(), ostream_iterator<string>(st,"|"));
string s = st.str();
cout << s;
получаем строку "первая|вторая|третья|"


Название: Re: Конвертировать list<string> в string
Отправлено: m_ax от Апреля 23, 2011, 13:32
А теперь о том что я нашел
Код:
list<string> lst;
lst.push_back("первая");
lst.push_back("вторая");
lst.push_back("третья");

ostringstream st;
copy(lst.begin(), lst.end(), ostream_iterator<string>(st,"|"));
string s = st.str();
cout << s;
получаем строку "первая|вторая|третья|"
Сомнительное решение, в том плане, что я не вижу преимуществ перед обычным циклом.
Код
C++ (Qt)
void convert(const list<string> &lst, string &str, const string & sep = "|") {
   list<string>::const_iterator it = lst.begin();    
   for (it != lst.end(); ++it) str += ((*it)+sep);
}
 
А в Вашем примере нужно дополнительно создавать объект ostringstream, затем после его заполнения, конвертировать его в строку и вновь копировать результат в str.
Короче, не убедительно..


Название: Re: Конвертировать list<string> в string [решено]
Отправлено: iks от Апреля 23, 2011, 13:48
Ну на вкус и цвет =)
По скорости пока не смотрел что лудше срабатывает, но меня это устраивает, применяю при записе list в MySql поэтому и искал подобное решение, и еще в таком решении есть реализация использования любых массивов и их преобразование в строку.
Вот массив int так-же можно работать с char просто нет лишних телодвижений
Код:
list<int> lst;
lst.push_back(1);
lst.push_back(2);
lst.push_back(3);

ostringstream st;
copy(lst.begin(), lst.end(), ostream_iterator<int>(st,"|"));
string s = st.str();
-------------------------------------------
Да и вообще, решение рабочее, кому надо сам выберет то что ему лудше использовать, все зависит от ситуации.
Ни кто не говорит что это конечная инстанция и пути в других направлениях нет, я в первом посте писал что можно пройти через цикл, но нужен другой вариант, вот и написал его когда нашел.


Название: Re: Конвертировать list<string> в string [решено]
Отправлено: m_ax от Апреля 23, 2011, 14:17
Ну на в кус и цвет =)
А уж по сути идет создание заполнение и конвертирование, где второе конвертирование не вижу.
По скорости пока не смотрел что лудше срабатывает, но меня это устраивает, применяю при записе list в MySql поэтому и искал подобное решение, и еще в таком решении есть реализация использования любых массивов и их преобразование в строку.
Вот массив int так-же можно работать с char просто нет лишних телодвижений
Код:
list<int> lst;
lst.push_back(1);
lst.push_back(2);
lst.push_back(3);

ostringstream st;
copy(lst.begin(), lst.end(), ostream_iterator<int>(st,"|"));
string s = str_.str();
Да, если вопрос ставится так, что список не ограничевается только типом string, то вариант с ostringstream удобней) Потому как им в этом случае всё равно придётся пользоваться.
Сам его использую, когда необходимо создать текст содержащий и числовые значения.
Но если изначально известно, что работать нужно со строками, то я бы использовал вариант с обычным циклом.
Или обобщил бы решение, написав шаблонную функцию конвертирования и реализовал специализацию для типа string:
Код
C++ (Qt)
template <class InputIterator, class T>
string convert(InputIterator first, InputIterator last, const string &sep = "|") {
   ostringstream st;
   copy(first, last, ostream_iterator<T>(st, sep));  
   return st.str();
}
template <class InputIterator>
string convert<string>(InputIterator first, InputIterator last, const string &sep = "|") {
   string str;
   for (first != last; ++first) str += (*first)+sep;
   return str;
}