使用STD集查找时,该程序将不会编译

When using std set find, the program will not compile

本文关键字:程序 编译 STD 查找 使用      更新时间:2023-10-16

我正在尝试在std :: set中找到一个字符串,但是当使用std :: set :: 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"
};

这是编译器输出的粘贴:https://pastebin.com/u6dfy8lq

我是正确的,说该错误声称它不能将std::__cxx11::basic_string<char>转换为std::__cxx11::basic_string<char>

谢谢您的帮助!

std::set<T>::find()返回的类型是Iterator

您无法将Iterators传递给输出流(通常在说(。但是您可以将迭代器推迟以获取对T的引用,并且如果通过operator<<流式传输,则它将打印。

auto find = commands.find("X");
std::cout << (*find) << "n;
              ^  // de-reference the iterator.

现在不要像上面完成的那样编写代码。这里的问题是发现可能失败。如果发现失败,它将返回容器的end()迭代器。拒绝end()迭代器是不确定的行为,因此您必须真正检查一下。

auto find = commands.find("X");
if (find != commands.end()) {
    std::cout << (*find) << "n;
} else {
    std::cout << "Failedn";
}

查找返回类型容器的对象:: iterator

http://www.cplusplus.com/reference/set/set/find/

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

您可能想知道的是是否找到了,因此您可以流式传输(commands.find("help cmmds.cpp") != commands.end())

我是正确的,说该错误声称它不能将std :: __ cxx11 :: basic_string转换为std :: __ __ cxx11 :: basic_string?

否。那是不准确的。

错误声称它不能将std::set<std::__cxx11::basic_string<char>, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::__cxx11::basic_string<char> > >::iterator转换为operator<<(basic_ostream<_CharT, _Traits>&, ....的过载设置的任何候选者。

让我们称该类型的set::iterator表示简洁。这就是set::find返回的内容以及您尝试插入输出流的内容。


您需要决定通过尝试将迭代器插入输出流的尝试。

如果您的意图是打印集合中是否存在值,则可以使用此方法:

// 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;