C++ 使用std set find时,程序不会编译

C++ 使用std set find时,程序不会编译,c++,C++,我试图在std::set中查找字符串,但在使用std::set::find时,它会产生一个我不理解的很长的错误。我可以从程序中访问集合,因此这不是问题所在 当我刚刚运行find时,它工作得很好,但是当我在任何事情中使用它时,比如将它设置为变量或试图输出它,编译器都会崩溃。我看到错误来自C++ 7文件夹,但是这应该是C++ 11,所以我不知道。 下面是我尝试使用命令的地方: int interperet() { cout << ">"; if (!cin.getline

我试图在std::set中查找字符串,但在使用std::set::find时,它会产生一个我不理解的很长的错误。我可以从程序中访问集合,因此这不是问题所在

当我刚刚运行find时,它工作得很好,但是当我在任何事情中使用它时,比如将它设置为变量或试图输出它,编译器都会崩溃。我看到错误来自C++ 7文件夹,但是这应该是C++ 11,所以我不知道。 下面是我尝试使用命令的地方:

int interperet() {
  cout << ">"; 
  if (!cin.getline(input,sizeof(input))) {
    cout << "ErrCode 1: Could not get input" << endl;
  }

  cout << commands.find("help cmmds.cpp");


  return 0;
}
这是布景:

set<string> commands = {
  "help cmmds.cpp"
};
以下是编译器输出的pastebin:

我所说的错误声明它无法将std::u cx11::basic_字符串转换为std:u cx11::basic_字符串,对吗


谢谢你的帮助

Find返回Container::iterator类型的对象

通常,这些对象不支持打印/流式处理方法


您可能想知道是否找到了它,这样您就可以对命令进行流式处理。findhelp cmmds.cpp!=改为commands.end。

Find返回Container::iterator类型的对象

通常,这些对象不支持打印/流式处理方法

您可能想知道是否找到了它,这样您就可以对命令进行流式处理。findhelp cmmds.cpp!=改为commands.end。

std::set::find返回的类型是迭代器

一般来说,您不能将迭代器传递到输出流。但是您可以取消对迭代器的引用以获得对T的引用,如果可以通过操作符进行流化,那么std::set::find返回的类型就是迭代器

一般来说,您不能将迭代器传递到输出流。但您可以取消对迭代器的引用,以获得对T的引用,如果这是通过运算符流化的 我所说的错误声明它无法将std::u cx11::basic_字符串转换为std:u cx11::basic_字符串,对吗

不,那不准确

该错误声明它无法将std::set::iterator转换为运算符重载集的任何候选项 我所说的错误声明它无法将std::u cx11::basic_字符串转换为std:u cx11::basic_字符串,对吗

不,那不准确


该错误声明它无法将std::set::iterator转换为运算符重载集的任何候选对象。您应该查阅参考以查看find实际返回的内容:请参阅如何使用a查看find实际返回的内容:请参阅如何使用a如何修改其源代码,很好,找到的字符串将是字符串输入,因为它是一个简单的集合,所以唯一有用的信息是是否找到该项,因此您唯一可以打印的是找到该项的测试。如果迭代器不能提供正在查找的值,那么迭代器有什么好处?迭代器应该提供一种方法来访问找到的数据(如果找到了)。我会同意这是一个地图还是一个带有自定义排序方法的零件索引集。就目前而言,所有这些对您来说都是有用的,就是告诉您是否找到了它,也许您可以从那里迭代到最后。如果我在测试上界或下界,我也会同意你的观点。这是一个非常简单的例子,但除了告诉你你要找的确切字符串已经找到或没有找到之外,没有什么用处。OP应该如何修改它们的源,因为找到的字符串是字符串输入,因为它是一个简单的集合,所以唯一有用的信息是是否找到了该项,因此,您唯一可以打印的就是找到的测试。如果迭代器不能提供正在查找的值,那么迭代器有什么好处?迭代器应该提供一种方法来访问找到的数据(如果找到了)。我会同意这是一个地图还是一个带有自定义排序方法的零件索引集。就目前而言,所有这些对您来说都是有用的,就是告诉您是否找到了它,也许您可以从那里迭代到最后。如果我在测试上界或下界,我也会同意你的观点。这是一个非常简单的例子,但除了告诉你你要的字符串是否已经找到外,没有什么用处。非常感谢!这完全有道理。由于某种原因,我想我会返回字符串。非常感谢!这完全有道理。由于某些原因,我认为find将返回字符串。感谢您的详细解释!我甚至从未想过使用contains。@Lukeime,contains在官方标准中还不存在,因为它将在即将到来的C++20标准中引入。但它已经得到了相对较新的标准库实现的支持。我正在使用的程序只支持c++11,所以我不认为这是可行的。谢谢你的详细解释!我甚至从未想过使用contains。@Lukeime,contains在官方标准中还不存在,因为它将在即将到来的C++20标准中引入。但是
它已经得到了相对较新的标准库实现的支持。我正在使用的程序只支持c++11,所以我认为这不可行。
auto find = commands.find("X");
std::cout << (*find) << "\n;
              ^  // de-reference the iterator.
auto find = commands.find("X");
if (find != commands.end()) {
    std::cout << (*find) << "\n;
} else {
    std::cout << "Failed\n";
}
// only since C++20
cout << commands.contains("help cmmds.cpp");
// pre C++20
cout << commands.find("help cmmds.cpp") != commands.end();
const char* str = "help cmmds.cpp";
if (commands.contains(str))
    cout << str;
auto it = commands.find("help cmmds.cpp");
if (it != commands.end())
    std::cout << *it;