我试图在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"
};
?
谢谢您的帮助!
答案 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;