Russian Qt Forum
Ноябрь 23, 2024, 08:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Конвертировать list<string> в string [решено]  (Прочитано 6400 раз)
iks
Гость
« : Апрель 23, 2011, 11:07 »

Есть список строк
Код:
list<string> lst;
lst.push_back("первая");
lst.push_back("вторая");
lst.push_back("третья");
надо из него получить строку такого типа
Код:
string str = "первая|вторая|третья";
можно конечно запустить циклом, но хотелось бы проще
« Последнее редактирование: Апрель 23, 2011, 12:42 от iks » Записан
alexman
Гость
« Ответ #1 : Апрель 23, 2011, 11:11 »

Не знаю как в stl, а в Qt есть метод QString QStringList::join ( const QString & separator ) const
Записан
iks
Гость
« Ответ #2 : Апрель 23, 2011, 11:16 »

вопрос задан не по Qt а именно по c++ это в cgi используется
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 23, 2011, 11:34 »

можно конечно запустить циклом, но хотелось бы проще
Если Вы и найдете что-то "ну очень крутое" (чтобы все-таки записать 1 строку вместо 2 с циклом), то это будет только в минус. Хотя бы потому что так Вы заставляете всех читающих знать эту "крутизну". Ни к чему это.
Записан
iks
Гость
« Ответ #4 : Апрель 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;
получаем строку "первая|вторая|третья|"
« Последнее редактирование: Апрель 23, 2011, 14:00 от iks » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #5 : Апрель 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.
Короче, не убедительно..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
iks
Гость
« Ответ #6 : Апрель 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();
-------------------------------------------
Да и вообще, решение рабочее, кому надо сам выберет то что ему лудше использовать, все зависит от ситуации.
Ни кто не говорит что это конечная инстанция и пути в других направлениях нет, я в первом посте писал что можно пройти через цикл, но нужен другой вариант, вот и написал его когда нашел.
« Последнее редактирование: Апрель 23, 2011, 14:12 от iks » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Апрель 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;
}
 
« Последнее редактирование: Апрель 23, 2011, 14:18 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.146 секунд. Запросов: 23.