0

Программа должна выводить, сколько раз каждое слово встречается в строке, но этого не происходит. Вот код:

void main()
{   
    map <string,int>m;
    map<string,int>::iterator it;
vector &lt;string&gt; v1;int n;int sum=1;

cout<<"size of vector"<<endl; cin>>n; cin.get(); for(int i=0;i<n;++i) {
string str; getline(cin,str,'\n'); } for(int i=0;i<v1.size();++i) {
m[v1[i]]++; } for( it=m.begin();it!=m.end();++it) {
cout<<it->first<<" "<<it->second; } system("PAUSE");

}

  • @Роман Пономаренко, Чтобы отформатировать код, выделите его мышью и нажмите на кнопку {} редактора. – iksuy Nov 19 '14 at 08:17
  • @Роман Пономаренко, Если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом). – iksuy Nov 19 '14 at 08:42

2 Answers2

1

У вас нигде не сохраняются считанные строки. Полагаю, нужно так.

for (int i = 0; i < n; ++i) {
    string str;
    getline(cin, str, '\n');
    v1.push_back(str);
    m.insert(std::make_pair(str, 0));
}
for (int i = 0; i < v1.size(); ++i) {
    m[v1[i]]++;
}

Обновление

http://ideone.com/SPY4Nx Тут всё работает

#include<map>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>

using namespace std;

int main() { map<string, int> m; map<string, int>::iterator it; vector<string> v1; int n; int sum = 1; cout << "size of vector" << endl; cin >> n; cin.get(); for (int i = 0; i < n; ++i) { string str; getline(cin, str, '\n'); v1.push_back(str); m.insert(std::make_pair(str, 0));

}
for (int i = 0; i &lt; v1.size(); ++i) {
    m[v1[i]]++;
}
for (it = m.begin(); it != m.end(); ++it) {
    cout &lt;&lt; it -&gt; first &lt;&lt; " " &lt;&lt; it -&gt; second;
}
system("PAUSE");
return 0;

}

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
iksuy
  • 10,475
0

Чтобы посчитать слова, можно использовать unordered_map, которая более эффективна чем map, если кол-во слов большое (O(1) (амортизовано) против O(log n) для каждого слова).

Если каждая строка содержит ровно одно слово, то подсчитать слова совсем просто:

unordered_map<string, size_t> counter;
string line;
getline(cin, line); // read n and ignore it
while(getline(cin, line)) // count words
    ++counter[line];

Чтобы напечатать в порядке убывания частоты слов (самые встречаемые слова сначала) можно скопировать частоты в вектор и отсортировать его по частоте:

vector<pair<string,size_t>> v(begin(counter), end(counter));
sort(begin(v), end(v), [](const auto& a, const auto& b) {
        return a.second > b.second;
    });
for (const auto& p : v)
    cout << p.first << " " << p.second << endl;

Полный пример

5
One
Two
Three
One
One

Вывод

One 3
Three 1
Two 1

Если нужно вывести слова в "алфавитном" (лексикографическом) порядке и частота слов небольшая и/или производительность не важна, то можно использовать просто map без unordered_map + sort:

/** Count words.
One word per line.
Print words in lexicographical order.

To try:

  $ g++ -std=c++11 count-words-map.cpp &amp;&amp; ./a.out &lt;input
  One 3
  Three 1
  Two 1

*/ #include <iostream> #include <map>

int main() { using namespace std; map<string, size_t> counter; string line; getline(cin, line); // read n and ignore it while(getline(cin, line)) // count words ++counter[line];

if (!cin.eof())
    return 1; // I/O error

// print words and their frequencies
for (const auto&amp; p : counter)
    cout &lt;&lt; p.first &lt;&lt; " " &lt;&lt; p.second &lt;&lt; endl;

}

В данном случае вывод (случайно) получается таким же как и для unordered_map.

jfs
  • 52,361