【问题标题】:An error from word-count program: expected expression字数统计程序出错:预期表达式
【发布时间】:2016-02-26 11:51:10
【问题描述】:

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

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

【问题讨论】:

    标签: c++ sorting stl fstream word-count


    【解决方案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::mapstd::map 的元素是 std::pair&lt;std::string, int&gt; 的实例,但您的输入迭代器仅提供 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&lt;&gt; 没有过载。您基本上需要一个普通的循环或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;
    }
    

    【讨论】:

    • 仍然得到那个错误:31:11: error: expected expression [&](string const & s){ M[s]++; }); [&](std::pair<:string int> const & p1, std::pair<:string int> const & p2)
    • 两个错误都指向“ [ ”。在 for_each 循环中,第三个参数。我不知道为什么,这没有任何意义。
    • @Dorothy 你启用了 C++11 支持吗?
    • @wilx 我无法使用 ifstream in_file("sample_doc.txt");我确定我的文件在 Eclipse 的目录和项目中。但是我跑了之后什么也没发生。此外,我可以在您提供的链接中运行您的程序,但我无法在输入“main.cpp”的 Eclipse 上运行它。我跑了之后什么也没发生。构建没问题,我启用了 C++ 11 支持。你能帮助我吗?非常感谢。
    • @Dorothy:我使用main.cpp 作为测试的输入。您必须将其替换为您自己的输入文件。如果您在打开文件时遇到问题,请尝试使用输入文件的绝对路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2021-10-15
    相关资源
    最近更新 更多