Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1

Массив имен из строки с разделителем преобразовать в vector<string>

15.05.2025, 17:15. Показов 4518. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я самоучка и по работе язык программирования использую для написания программ решения прикладных задач. При этом часто пользуюсь сторонними модулями и библиотеками. Задачи в основном математические. В этот раз столкнулся со строками, что не часто. Суть задачи следующая: библиотека формирует строку с массивом доступных имен веществ, используя в качестве разделителя запятую:"butane,amonia,air,water". Мне их нужно было преобразовать в массив имен (вектор). Не долго думая, написал следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
using namespace std;
 
vector<string> GetFluidList(string line)
{
    string  tmp="";
    vector<string> ans;
    for (auto it(line.begin()); it != line.end(); it++)
    {
        if (*it != ',')
            tmp += *it;
        else
        {
            ans.push_back(tmp);
            tmp = "";
        }
    }
    ans.push_back(tmp);
    sort(begin(ans), end(ans));
    return ans;
}
Код рабочий, со своей задачей справляется. Но вопрос следующий из любопытства, а если стандартное средство решение такое задачи? (В STL или boost)? И есть ли предложения, что в нем поменять, сделав менее топорным?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2025, 17:15
Ответы с готовыми решениями:

vector<vector<double>> => 2 * vector<vector<double>>
Здравствуйте. У меня следующий вопрос. Имеется двумерный массив, созданный через класс...

Map<string,vector<pair<string,vector<int> > > > Поиск во всем map
Как пройти циклом по всему map такого вида? map&lt; string, vector&lt; pair&lt; string, vector&lt;int&gt; &gt; &gt; &gt;...

Разделить vector<string> на два vector<string>
У меня есть vector&lt;string&gt; line_from_file; line_from_file.resize(N); N-некое число Когда я...

5
фрилансер
 Аватар для Алексей1153
6434 / 5629 / 1126
Регистрация: 11.10.2019
Сообщений: 14,969
15.05.2025, 18:15
Лучший ответ Сообщение было отмечено mustimur как решение

Решение

mustimur, если строки небольшие, можно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <sstream>
#include <vector>
 
auto GetFluidList(std::string data)
{
    std::istringstream iss(data);
    std::vector<std::string> list;
    for(std::string word; std::getline(iss,word,',');)
    {
        list.push_back(word);
    }
    return list;
}
 
int main()
{
    auto list=GetFluidList("butane,amonia,air,water");
    for(auto& w:list)
    {
        std::cout<<w<<'\n';
    }
}
butane
amonia
air
water


Добавлено через 15 минут
так чуть более эффективнее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
 
auto GetFluidList(std::string_view data)
{
    std::vector<std::string> list;
    for(size_t beg=0; (beg=data.find_first_not_of(','))!=data.npos;)
    {
        if(auto end=data.find(',',beg); end!=data.npos)
        {
            list.emplace_back(data.substr(beg,end-beg));
            data.remove_prefix(end-beg+1);
        }
        else
        {
            list.emplace_back(data.substr(beg));
            break;
        }
    }
    return list;
}
 
int main()
{
    auto list=GetFluidList("butane,amonia,air,water");
    for(auto& w:list)
    {
        std::cout<<w<<'\n';
    }
}
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 867
Записей в блоге: 1
15.05.2025, 20:23  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
так чуть более эффективнее
Эффективность будет на больших строка, относительно небольшие строки с первым Вашем кодом быстрее должны работать. Про второй Ваш вариант думал (с поиском и удалением сегмента текста), не стал замарачиваться (строки относительно короткие не более 200 веществ). А за первый синтаксис отдельное спасибо. Со строками практически не сталкиваюсь, этот инструмент
C++
1
2
#include <sstream>
std::istringstream iss(data);
мне не знаком. И пост по большому счету для сбора таких примеров и писал, для их разбора потом. Спасибо еще раз.
0
фрилансер
 Аватар для Алексей1153
6434 / 5629 / 1126
Регистрация: 11.10.2019
Сообщений: 14,969
15.05.2025, 21:54
Цитата Сообщение от mustimur Посмотреть сообщение
небольшие строки с первым Вашем кодом быстрее должны работать.
нет, второй вариант гарантированно будет эффективнее на любых строках

Цитата Сообщение от mustimur Посмотреть сообщение
и удалением сегмента текста
там нет удаления, в этом и плюс

Цитата Сообщение от mustimur Посмотреть сообщение
std::istringstream
это строковый поток
1
45 / 37 / 10
Регистрация: 25.02.2025
Сообщений: 84
16.05.2025, 16:29
Я тут хочу показать ещё пример как разбить строку на токены, хотя это очень неэффективно.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <ranges>
#include <vector>
#include <memory>
 
 
void f2( const std::string& str1, std::vector< std::string >& vec2 )
{
    for ( const auto& r1 : 
        std::vector< char > { str1.begin(), str1.end() } 
        | std::views::split( ',' ) )
    {
        vec2.push_back( std::string { r1.begin(), r1.end() } );
    }
}
 
int main()
{
    std::string str1 {"abc,f67,hj2"};
    std::vector< std::string > vec1;
 
    f2( str1, vec1 );
 
    for ( const auto& elem : vec1 )
    {
        std::cout << elem << std::endl;
    }
    
}
Добавлено через 5 минут
Здесь строка преобразуется в поток символов и к ней применяется операция split (разделение на несколько потоков). Потом эти потоки символов объединяются в строки и кладутся в массив.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.05.2025, 00:21
Цитата Сообщение от mustimur Посмотреть сообщение
или boost
В boost есть boost::split.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2025, 00:21
Помогаю со студенческими работами здесь

Не могу вставить элемент в second(vector) мультимапа. multimap<string, vector<string>>
#include &lt;iostream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;string&gt;...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я...

Почему vector v{vector{1, 2} }; имеет тип vector<int>
std::vector v{std::vector{1, 2} }; Почему v выводиться как vector&lt;int&gt;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru