Работа с векторами на STL С++ (Занесение в вектор разабранной на слова строки)

Модератор: Модераторы разделов

Аватара пользователя
MPak
Сообщения: 24

Работа с векторами на STL С++

Сообщение MPak »

Писал на с++ лабу в универ и задался вопросом: Есть ли в STL функция разбиения строки на слова с последующим занесением их в вектор. Т.Е. взять строку например "fff,a,gg.hj el ew gfgsg, . esgt:gew ; "
и получить:
"fff"
"a"
"gg"
"hj" и т.д. как элементы вектора vector<string> v;
Искал и продолжаю искать, но пока не нашел...
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Zmoukie
Сообщения: 29

Re: Работа с векторами на STL С++

Сообщение Zmoukie »

Example

Код: Выделить всё

./ crt_strtok.c
/* In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */

#include <string.h>
#include <stdio.h>

char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

int main( void )
{
   printf( "Tokens:\n" );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}


Output

Tokens:
A
string
of
tokens
and
some
more
tokens

Пример из MSDN. На STL переведешь сам?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Работа с векторами на STL С++

Сообщение serzh-z »

MPak писал(а):
04.11.2005 15:26
Писал на с++ лабу в универ и задался вопросом: Есть ли в STL функция разбиения строки на слова с последующим занесением их в вектор. Т.Е. взять строку например "fff,a,gg.hj el ew gfgsg, . esgt:gew ; "
и получить:
"fff"
"a"
"gg"
"hj" и т.д. как элементы вектора vector<string> v;
Искал и продолжаю искать, но пока не нашел...


Увы, нет. Советую обратиться к BOOST - эта библиотека близка к стандарту языка, а также к STL по духу, использует/расширяет STL. В этом случае вам поможет boost::tokenizer. Ну а разложить токены в std::vector - уже не проблема.

Если использование Буста недопустимо - то, имхо, вполне нормальное решение использовать strtok() из libc.

serzh-z писал(а):
04.11.2005 18:39
Если использование Буста недопустимо - то, имхо, вполне нормальное решение использовать strtok() из libc.


Во, кстати, и пример с strtok() уже запостили...
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Работа с векторами на STL С++

Сообщение MPak »

СпасиБо большое за помощЬ, но разбил я вектор уже через parse_str():
void parse_str(string str, vector<string> &vect)
{
std::string::size_type i(0),tmp;
do
{
tmp=str.find_first_of(" ,.:;", i);
vect.push_back(str.substr(i,tmp == std::string::npos ? tmp : tmp -i));
i=tmp+1;
}
while( tmp != std::string::npos );

}
теперь стоит проблема отсортировать по частоте встречаемости...
Тож хотелось бы через STL'ку



Кстати, а что такое BOOST
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Работа с векторами на STL С++

Сообщение serzh-z »

MPak писал(а):
04.11.2005 21:45
void parse_str(string str, vector<string> &vect)
{
std::string::size_type i(0),tmp;
do
{
tmp=str.find_first_of(" ,.:;", i);
vect.push_back(str.substr(i,tmp == std::string::npos ? tmp : tmp -i));
i=tmp+1;
}
while( tmp != std::string::npos );

}
теперь стоит проблема отсортировать по частоте встречаемости...
Тож хотелось бы через STL'ку


Думаю, что нужно считать число вхождений токена в строку. А в вектор (то есть уже не в вектор, а в карту например - или же в вектор из std::pair) пихать токен и кол-во его вхождений. Потом остаёться лишь сделать обычную сортировку через свой предикат.

MPak писал(а):
04.11.2005 21:45
Кстати, а что такое BOOST


У-у, это такая штука... Лучше сам посмотри: http://boost.org :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Работа с векторами на STL С++

Сообщение oav »

serzh-z писал(а):
07.11.2005 11:17
У-у, это такая штука... Лучше сам посмотри: http://boost.org :)


Код: Выделить всё

std::string val( "aa,bb,cc" );
        std::vector<std::string> values;

    boost::algorithm::split( values , val , algorithm::is_any_of( "," ));
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Работа с векторами на STL С++

Сообщение MPak »

oav serzh-z
Спасибо большое за помощь!!!


Кстати, можно существенно продлить срок службы клавиатуры, если каждый раз не писать std::...
std::string val( "aa,bb,cc" );

, а один раз написать
using namespace std;
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Работа с векторами на STL С++

Сообщение d_Sun »

MPak писал(а):
07.11.2005 16:37
oav serzh-z
Спасибо большое за помощь!!!


Кстати, можно существенно продлить срок службы клавиатуры, если каждый раз не писать std::...
std::string val( "aa,bb,cc" );

, а один раз написать
using namespace std;


Что правда? :D Я в некоторых книгах натыкался на высказывания, что использование using есть плохой стиль программирования... Хотя сам использую постоянно :)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Работа с векторами на STL С++

Сообщение oav »

MPak писал(а):
07.11.2005 16:37
oav serzh-z
Спасибо большое за помощь!!!


Кстати, можно существенно продлить срок службы клавиатуры, если каждый раз не писать std::...
std::string val( "aa,bb,cc" );

, а один раз написать
using namespace std;

Я стиль кодирования никому не навязываю, пишите как считаете лучше и берегите клавиатуры если вам их жалко :) B)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Работа с векторами на STL С++

Сообщение serzh-z »

oav писал(а):
07.11.2005 16:57
MPak писал(а):
07.11.2005 16:37

oav serzh-z
Спасибо большое за помощь!!!


Кстати, можно существенно продлить срок службы клавиатуры, если каждый раз не писать std::...
std::string val( "aa,bb,cc" );

, а один раз написать
using namespace std;

Я стиль кодирования никому не навязываю, пишите как считаете лучше и берегите клавиатуры если вам их жалко :) B)


Угу... пока сам не натрахаешься с конфликтом имён - будешь использовать using и избегать использования std::... Ты посмотри сколько в STL имён, которые ты можешь захотеть использовать с своём коде. Потом решишь, что проще сразу пять символов добавить, чем потом - при рефакторинге. ;) В первом случае и клава будет живее и нервы целее. :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Работа с векторами на STL С++

Сообщение oav »

serzh-z писал(а):
07.11.2005 17:16
Угу... пока сам не натрахаешься с конфликтом имён - будешь использовать using и избегать использования std::... Ты посмотри сколько в STL имён, которые ты можешь захотеть использовать с своём коде. Потом решишь, что проще сразу пять символов добавить, чем потом - при рефакторинге. ;) Во втором случае и клава будет живее и нервы целее. :)

;) :) пущай, когда учишься на своих ошибках = эффективнее выходитЪ
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Работа с векторами на STL С++

Сообщение d_Sun »

serzh-z писал(а):
07.11.2005 17:16
Угу... пока сам не натрахаешься с конфликтом имён - будешь использовать using и избегать использования std::... Ты посмотри сколько в STL имён, которые ты можешь захотеть использовать с своём коде. Потом решишь, что проще сразу пять символов добавить, чем потом - при рефакторинге. ;) В первом случае и клава будет живее и нервы целее. :)


При грамотном использовании пространств имен можно свободно использовать using...
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Работа с векторами на STL С++

Сообщение oav »

d_Sun писал(а):
08.11.2005 11:24
При грамотном использовании пространств имен можно свободно использовать using...

Если честно, не понял что имелось в виду :huh:
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Работа с векторами на STL С++

Сообщение d_Sun »

oav писал(а):
08.11.2005 12:29
Если честно, не понял что имелось в виду :huh:


Я имел в виду то, что те Ваши имена которые возможно будут перекрываться с STD просто помещаете в свое пространство имен ;)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Работа с векторами на STL С++

Сообщение oav »

d_Sun писал(а):
08.11.2005 13:11
oav писал(а):
08.11.2005 12:29

Если честно, не понял что имелось в виду :huh:


Я имел в виду то, что те Ваши имена которые возможно будут перекрываться с STD просто помещаете в свое пространство имен ;)

и чем лучше писать my_namespace::string но при этом не писать std::string?
и кто будет следить за тем кто и где и в каком порядке вводит using? Нет, если проект пишет один человек - это нормально наверно (пока проект не подростет), но в реальных условиях есть много граблей на которые можно наступить. За подробностями к Саттеру и компании. Как бы я ничего не навязываю - просто советую :)
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Работа с векторами на STL С++

Сообщение MPak »

и чем лучше писать my_namespace::string но при этом не писать std::string?
и кто будет следить за тем кто и где и в каком порядке вводит using? Нет, если проект пишет один человек - это нормально наверно (пока проект не подростет), но в реальных условиях есть много граблей на которые можно наступить. За подробностями к Саттеру и компании. Как бы я ничего не навязываю - просто советую

Теперь я не понял что имелось ввиду. :wacko:
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Работа с векторами на STL С++

Сообщение d_Sun »

oav писал(а):
08.11.2005 13:26
если проект пишет один человек - это нормально наверно (пока проект не подростет), но в реальных условиях есть много граблей на которые можно наступить.


Вобщем согласен... ;)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Работа с векторами на STL С++

Сообщение MPak »

Вот решение этой задачи
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Работа с векторами на STL С++

Сообщение Zeus »

MPak писал(а):
04.11.2005 15:26
Писал на с++ лабу в универ и задался вопросом: Есть ли в STL функция разбиения строки на слова с последующим занесением их в вектор. Т.Е. взять строку например "fff,a,gg.hj el ew gfgsg, . esgt:gew ; "
и получить:
"fff"
"a"
"gg"
"hj" и т.д. как элементы вектора vector<string> v;
Искал и продолжаю искать, но пока не нашел...

Вроде у Страуструпа подобных примеров было: или про строки или про контейнеры.
Спасибо сказали: