将 std::find 与 std::string 数组一起使用时出现问题

Posted

技术标签:

【中文标题】将 std::find 与 std::string 数组一起使用时出现问题【英文标题】:Issue when using std::find with an array of std::string 【发布时间】:2020-10-08 11:46:12 【问题描述】:

我正在尝试运行这个比较器:

if (std::find(movements->begin(), movements->end(), commandBuffer) != movements->end())

与:

const std::string movements[8] = "north", "south", "east", "west", "n", "s", "e", "w";

其中commandBufferstd::string

在 MinGW32 9.2.0 上,我得到以下信息:

错误:'operator==' 不匹配(操作数类型为 'const char' 和 'const std::__cxx11::basic_string')

【问题讨论】:

【参考方案1】:

要么使用std::cbeginstd::cend,要么将您的数组更改为std::array

std::array<const std::string, 8> movements = "north", "south", "east", "west", "n", "s", "e", "w";
const std::string commandBuffer = "north";

if (std::find(movements.begin(), movements.end(), commandBuffer) != movements.end())
    std::cout << "Found!" << std::endl;

【讨论】:

【参考方案2】:

movements 是一个指向字符串数组的指针,基本上:

const std::string* movements;

movements-&gt;begin() 等于(movements[0]).begin() 并指向第一个字符串的第一个字符,而不是字符串本身。所以你正在迭代第一个字符串的字符。

改为遍历字符串数组 使用begin(movemens), end(movements)

如果您使用过std::vector&lt;string&gt; movementsstd::array&lt;string, N&gt;,您的代码也可以工作。

【讨论】:

以上是关于将 std::find 与 std::string 数组一起使用时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将 std::string 与 libcurl 一起使用?

将 TaskDialogConfig 与 std::string 一起使用

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

如何将CString和:: std :: string :: std :: wstring互相转换?

c# string与c++ std::string的互相转换