使用std set find时,程序将无法编译

时间:2019-05-03 16:40:17

标签: c++

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

当我只运行find时,它可以正常工作,但是当我将其用于任何内容(例如将其设置为变量或尝试将其输出)时,编译器就会出现异常。我看到错误来自c ++ 7文件夹,但是应该是c ++ 11,所以我不知道。

这是我尝试使用命令的地方:

table.teacherTable tr {
  width: 100%;
  font-size: 13px;
  border-collapse: separate;
  border-spacing: 50px 0;
  border: 0;
  margin: 0;
  padding: 0;
}

td {
  padding-right: 65px;
  margin: 0;
  border: 0;
  text-align: left;
  font-size: 13px;
  max-width: 100%;
}

td.redText {
  color: rgb(211, 32, 32);
  font-size: 13px;
}

th {
  font-size: 14px;
  font-weight: bold;
}

#teacherTableList {
  margin-top: 70px;
}

p {
  font-size: 19px;
  font-weight: bold;
}

这里是集合:

<div class="container" id="teacherTableList">
  <p>Students Checked In/Out Today... </p>
  <table class="teacherTable" id="">
    <thead>
      <tr>
        <th>Student Name</th>
        <th>Subject</th>
        <th>Check In Time</th>
        <th>Check Out Time</th>
        <th>Edit Student Session</th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let tod of studentsInToday">

        <td>{{ tod.classTimesStudentName }} </td>
        <td>{{ tod.classTimesSubjects }}</td>
        <td *ngIf="!tod.classTimesLogInRevised">{{ tod.classTimesLogInDate | date: 'medium' }}</td>
        <td *ngIf="tod.classTimesLogInRevised">{{ tod.classTimesLogInRevised | date: 'medium' }}</td>
        <td *ngIf="!tod.classTimesLogOffDate  && !tod.classTimesLogOffRevised" class="redText"> test</td>
        <td *ngIf="!tod.classTimesLogOffRevised">{{ tod.classTimesLogOffDate | date: 'medium' }}</td>
        <td *ngIf="tod.classTimesLogOffRevised">{{ tod.classTimesLogOffRevised | date: 'medium' }}</td>
        <td><a [routerLink]="['/teacher/teacheredit/', tod.classTimesRowId]">Edit</a></td>
      </tr>
    </tbody>
  </table>
</div>

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

我是否正确地说这个错误声称它无法将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" };

谢谢您的帮助!

3 个答案:

答案 0 :(得分:3)

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 << "Failed\n";
}

答案 1 :(得分:1)

查找返回类型为Container :: iterator的对象

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

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

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

答案 2 :(得分:1)

  

我是否正确地说错误是它无法将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;