c++ - 字数统计程序错误 : expected expression

标签 c++ sorting stl fstream word-count

我遇到了这个错误,它没有任何意义。

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”中的单词,并计算每个单词在“ map ”中出现的频率。 键是单词,值是单词在“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;
                ~~~~~~~~~ ^ ~~~~~~~~

或者:

    /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 个。我很困惑,我必须在这里问一下。 即使是提示对我来说也很有值(value)。 提前谢谢大家。

最佳答案

如果代码按原样工作就好了。这在一定程度上是有道理的。然而,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没有任何意义。它按其键排序。您必须将 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;
}

关于c++ - 字数统计程序错误 : expected expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33886875/

相关文章:

c++ - portaudio 只采集一份样本?

c++ - 如何查找整数在其十六进制表示中是否包含字母

java - 按字符串长度排序

java - 带线程的冒泡排序

c++ - 无法访问基类函数c++

c++ - 如何对数组使用 while 循环?

c++ - cmake、conan 和 qt hello world 项目构建错误

java - 字符串数组中的错误 indexOf

c++ - 为什么 std::vector 迭代器在 erase() 调用后失效?

c++ - STL迭代器和数组的关系