Поиск персонажа в строке в векторе - PullRequest
2 голосов
/ 19 апреля 2010

Судя по названию, я вроде сделал свою программу довольно сложным способом. НО! С таким же успехом я мог бы спросить xD

Это простая программа, которую я сделал в ответ на вопрос 3-3 «Ускоренный C ++», которая, на мой взгляд, является удивительной книгой.

Я создал вектор:

vector<string> countEm;

Это принимает все допустимые строки. Поэтому у меня есть вектор, который содержит элементы строк.

Далее я создал функцию

int toLowerWords( vector<string> &vec )
{
    for( int loop = 0; loop < vec.size(); loop++ )
        transform( vec[loop].begin(), vec[loop].end(),
            vec[loop].begin(), ::tolower );

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

Я создал третью и последнюю функцию для фактического подсчета слов, и вот где я застрял.

int counter( vector<string> &vec )
{

for( int loop = 0; loop < vec.size(); loop++ )
    for( int secLoop = 0; secLoop < vec[loop].size(); secLoop++ )
    {
        if( vec[loop][secLoop] == ' ' )

Это выглядит просто смешно. Использование двумерного массива для вызова символов вектора, пока я не найду пробел. Смешной. Я не верю, что это элегантное или даже жизнеспособное решение. Если бы это было жизнеспособное решение, я бы тогда возвратился из пробела и скопировал бы все символы, которые я нашел в отдельном векторе, и посчитал бы эти .

Тогда у меня вопрос. Как я могу разделить вектор строк на отдельные слова, чтобы я мог посчитать их? Я думал об использовании strchr, но это не дало мне никаких прозрений.


Решение по Нейлу:

stringstream ss( input );
while( ss >> buffer )
    countEm.push_back( buffer );

Из этого я мог легко посчитать (повторяющиеся) слова.

Затем я сделал решение через Вильгельма, которое я опубликую, как только переписываю его, так как случайно удалил это решение! Глупо с моей стороны, но я опубликую это, как только у меня это будет написано снова ^^

Я хочу поблагодарить всех вас за ваш вклад! Решения сработали, и я стал немного лучше программистом. Если бы я мог проголосовать твои вещи, то я бы: P Как только я смогу, я буду! И еще раз спасибо!

Ответы [ 3 ]

2 голосов
/ 19 апреля 2010

Вы можете использовать std::istringstream, чтобы извлечь слова одно за другим и сосчитать их. Но это решение потребляет O (n) в сложности пространства.

string text("So many words!");
size_t count =  0;
for( size_t pos(text.find_first_not_of(" \t\n"));
    pos != string::npos;
    pos = text.find_first_not_of(" \t\n", text.find_first_of(" \t\n", ++pos)) )
    ++count;

Возможно, не такой короткий, как решение Нейла, но не требует места и дополнительных выделений, кроме того, что уже использовано.

2 голосов
/ 19 апреля 2010

Если слова всегда разделены пробелами, самый простой способ разбить их - использовать поток строк:

string words = ....   // populat
istringstream is( words );

string word;
while( is >> word ) {
   cout << "word is " << word << endl;
}

Вы, конечно, захотите написать функцию для этого и применить ее к своим строкам. Или может быть лучше не хранить строки вообще, а разбивать их на слова при первоначальном вводе.

1 голос
/ 19 апреля 2010

Используйте токенайзер, такой как , указанный здесь в разделе 7.3 , чтобы разбить строки в вашем векторе на отдельные слова (или переписать его так, чтобы он просто возвращал количество токенов) и зациклить на вашем векторе подсчитать общее количество токенов, с которыми вы столкнулись.

...