【问题标题】:C++ array and find functions [duplicate]C ++数组和查找函数[重复]
【发布时间】:2014-05-11 12:02:14
【问题描述】:

我正在编写一个词法分析器,我正在使用一个数组来存储关键字和保留字:

string keywords[20] = {

  "function",
  "if",
  "while",
  "halt",
};

我正在尝试使用:

bool isKeyword(string s)
{
  return find( keywords.begin(), keywords.end(), s ) != keywords.end();
}

但我收到错误消息:“错误:在 'keywords' 中请求成员 'end',它属于非类类型 'std::string [20] {aka std::basic_string [20]}”

【问题讨论】:

  • 在尝试制作编译器之前(我想这就是您编写词法分析器的原因),您至少应该熟悉您所使用的语言的非常基本的概念使用。

标签: c++ arrays lexer


【解决方案1】:

普通数组没有方法,因此您不能在它们上调用begin()end()。但是你可以使用同名的非成员函数:

#include <alorithm> // for std::find
#include <iterator> // for std::begin, std::end

bool isKeyword(string s)
{
  std::find(std::begin(keywords), std::end(keywords), s ) != std::end(keywords);
}

如果你没有 C++11 支持,你可以自己轻松地把这些函数滚出来,或者使用数组的大小来获取结束迭代器:

return std::find(keywords, keywords + 20, s ) != keywords + 20;

【讨论】:

  • 事实上,我没有 C++11 支持,并且使用 .end 我得到了错误:请求成员 'end' in 'keywords',它是非类类型 'std ::string [20] {aka std::basic_string [20]}'再次
  • @user3599420 第二个解决方案应该在没有 C++11 的情况下工作。此答案的第一行解释了您遇到的错误。
  • 第一行是说我不能使用being和end with arrays,那么如何在最后一行使用.end呢?您能否进一步解释一下并感谢您的宝贵时间
  • @user3599420 抱歉,我没有修复那部分。它是同一问题的一部分,并且具有相同的解决方案。我现在修好了。
  • 非常感谢! +20 用于循环到数组的末尾,对吗?
猜你喜欢
  • 2015-06-14
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多