我遇到了这个错误而且没有任何意义。
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个非常奇怪的错误,它不像bug或其他东西。它一直说:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/..
/include/c++/v1/algorithm:1751:19:
error: no viable overloaded '='
*__result = *__first;
~~~~~~~~~ ^ ~~~~~~~~
OR:
/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;
~~~~~~ ^ ~~~~~~~
OR:
/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个。我很困惑,我必须在这里问一下。 即便提示对我也很有价值。 提前谢谢大家。
答案 0 :(得分: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 link):
#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;
}