Строки и слова

195
15 декабря 2016, 16:16

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

void 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');
}
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");
}
Answer 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 < v1.size(); ++i) {
        m[v1[i]]++;
    }
    for (it = m.begin(); it != m.end(); ++it) {
        cout << it -> first << " " << it -> second;
    }
    system("PAUSE");
    return 0;
}
Answer 2

Чтобы посчитать слова, можно использовать 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 && ./a.out <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& p : counter)
        cout << p.first << " " << p.second << endl;
}

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

READ ALSO
Как уменьшить размер изображения в Qt?

Как уменьшить размер изображения в Qt?

Как реализовать программу, которая бы получала на вход изображение, изменяла его, а потом сохраняла новый вариант куда-нибудь в другое место?

338
Как распознать изображение средствами Qt?

Как распознать изображение средствами Qt?

Здравствуйте все, кто читает это! Интересует такой вопрос: Как разбить изображение на пиксели и обработать каждый из них? Или как получить...

345
Действия с вектором

Действия с вектором

Доброго времени суток

167