2010-04-19 2 views
2

Судя по названию, я как бы сделал свою программу довольно сложным способом. НО! Я мог бы также спросить в любом случае 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 Как только я смогу, я буду! И еще раз спасибо!

ответ

2

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

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

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

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

+0

Эй! Я никогда не использовал istringstream, поэтому я действительно не знаю, какую магию вы здесь работаете, но я дам вам знать, смогу ли я решить проблему с этим решением ^^ Так спасибо за это! Как и выше, я буду указывать положительный результат, как только у меня будет разрешение на это. – IAE

2

Вы можете использовать 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; 

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

+0

Спасибо за ответ ^^ Я не могу голосовать, поэтому я отвечу на ваш ответ. Я не слышал какой-то синтаксис, который вы используете, поэтому я немного разбираюсь в этом, и я дам вам знать, как я общаюсь с ним, но спасибо за помощника! – IAE

+0

Помимо семантической ошибки, я имел ('text :: npos' вместо' string :: npos', который я только что исправил) нет ничего особенного в синтаксисе. Может быть, отступы заставили вас смутить ... Это простой цикл 'for', действительно. – wilhelmtell

+0

... и логическая ошибка. ew, я должен действительно проверить свой код, прежде чем я его опубликую. : s – wilhelmtell

1

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

+0

Эй, Джайлс! Я начал читать, и я подумал об использовании токенизатора, но я нашел strchr, прежде чем я смог найти strtok, и это более безопасный эквивалент. Я также позволю вам знать, могу ли я ответить на это с помощью этого решения, так как я хочу использовать их все как возможный ответ, чтобы я мог быть как можно более гибким позже на ^^ – IAE

Смежные вопросы