Ошибка программы подсчета слов: ожидаемое выражение

Я столкнулся с этой ошибкой, и это не имеет никакого смысла.

30:5: error: expected expression
[&](string & s){ M[s]++; } );
^

Вот мои коды:

#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
using namespace std;

int main()
{
ifstream in_file( "sample_doc.txt" );
ofstream out_file( "output.txt" );

istream_iterator< string > is( in_file );
istream_iterator< string > eof;

map< string, int > M;
copy( is, eof, inserter(M, begin(M)));

for_each(istream_iterator<string>(is),
istream_iterator<string>(),
[&](string & s){ M[s]++; } );
sort( M.begin(), M.end() );

ostream_iterator<string> os( out_file, " " );
copy( M.begin(), M.end(), os );

return 0;
}

Это программа для подсчета слов. Я написал эти коды, пытаясь сохранить слова из «sample_doc.txt» и изобразить частоту появления каждого слова в «карте».
Ключ — это слово, значение — количество раз, которое слово встречается в «sample_doc.txt».
Кроме того, я стараюсь не использовать низкоуровневые циклы C ++.
Самое главное, что когда я запустил эту программу в Eclipse, я получил около 13 очень странных ошибок, это не ошибка или что-то в этом роде. Это продолжает говорить:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/..
/include/c++/v1/algorithm:1751:19:
error: no viable overloaded '='
*__result = *__first;
~~~~~~~~~ ^ ~~~~~~~~

ИЛИ ЖЕ:

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/..
/include/c++/v1/algorithm:3855:40: error: invalid operands to binary expression
('std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<std::__1::basic_string<char>, int>,
std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char>, int>, void *> *, long> >' and
'std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<std::__1::basic_string<char>, int>,
std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char>, int>, void *> *, long> >')
difference_type __len = __last - __first;
~~~~~~ ^ ~~~~~~~

ИЛИ ЖЕ:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/..
/include/c++/v1/algorithm:3946:33: error: invalid operands to binary expression
('std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<std::__1::basic_string<char>, int>,
std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char>, int>, void *> *, long> >' and
'std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<std::__1::basic_string<char>, int>,
std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char>, int>, void *> *, long> >')
if (__i >= __j)
~~~ ^  ~~~

Примерно так и их 13. Я так растерялся, и я должен спросить это здесь.
Даже подсказки ценны для меня.
Спасибо всем заранее.

1

Решение

Было бы хорошо, если бы код работал как есть. Это имеет смысл в определенной степени. Тем не менее, C ++ не так просто.

#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
using namespace std;

int main()
{
ifstream in_file( "sample_doc.txt" );
ofstream out_file( "output.txt" );

istream_iterator< string > is( in_file );
istream_iterator< string > eof;

map< string, int > M;
copy( is, eof, inserter(M, begin(M)));

Вы не можете в std::map сюда. Элементы std::map являются примерами std::pair<std::string, int> но ваш входной итератор обеспечивает только std::string Предметы.

  for_each(istream_iterator<string>(is),
istream_iterator<string>(),
[&](string & s){ M[s]++; } );

Это на самом деле достаточно хорошо. Вам не нужно предыдущее copy,

  sort( M.begin(), M.end() );

Сортировка std::map не имеет никакого смысла. Сортируется по ключу. Вам придется скопировать карту в другом месте, как в std::vector,

  ostream_iterator<string> os( out_file, " " );
copy( M.begin(), M.end(), os );

Невозможно распечатать std::map сюда. Там нет перегрузки для печати std::pair<>, Вам в основном нужен обычный цикл или for_each() и сделайте печать вручную.

  return 0;
}

Вот исправленный код (Coliru ссылка):

#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <utility>
#include <sstream>

using namespace std;

int main()
{
ifstream in_file( "main.cpp" );
ofstream out_file( "output.txt" );

istream_iterator< string > is( in_file );
istream_iterator< string > eof;

map< string, int > M;
for_each(istream_iterator<string>(is),
istream_iterator<string>(),
[&](string const & s){ M[s]++; } );
std::vector<std::pair<std::string, int> > V (M.begin(), M.end());
sort( V.begin(), V.end(),
[&](std::pair<std::string, int> const & p1, std::pair<std::string, int> const & p2)
{return p1.second > p2.second;});

ostream_iterator<string> os( std::cout, " " );
for(auto const & p : V) {
std::ostringstream oss;
oss << p.first << " " << p.second << "\n";
*os = std::move (oss.str());
}

return 0;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]