C++ 二进制'==';:找不到接受类型为';std::pair<;常数';
这个错误很常见,但我所看到的解决方案都不适合我 我看到的解决方案是使用其他类型的操作数,而不是成对操作数,但这不应该成为借口 我在错误中理解的是,我没有用对定义相等运算符,但我没有在任何时候比较对,我总是使用键或值C++ 二进制'==';:找不到接受类型为';std::pair<;常数';,c++,C++,这个错误很常见,但我所看到的解决方案都不适合我 我看到的解决方案是使用其他类型的操作数,而不是成对操作数,但这不应该成为借口 我在错误中理解的是,我没有用对定义相等运算符,但我没有在任何时候比较对,我总是使用键或值 #include "cabezeras.h" using namespace std; int main() { string x; ifstream inFile; bool t2, t3; int times2 = 0, times3 = 0;
#include "cabezeras.h"
using namespace std;
int main()
{
string x;
ifstream inFile;
bool t2, t3;
int times2 = 0, times3 = 0;
map<char, int> mymap;
map<char, int>::iterator it;
pair<char, int> aux_pair;
inFile.open("C:/Users/victor/source/repos/AdventOfCode2018/Day2/input.txt");
if (!inFile) {
cout << "Unable to open file";
exit(1);
}
while (getline(inFile, x)) {
t2 = false, t3 = false;
mymap.clear();
for (int i = 0; i < x.length(); i++) {
it = find(mymap.begin(), mymap.end(), x[i]);
if (it == mymap.end()) {
aux_pair = make_pair(x[i], 1);
mymap.insert(aux_pair);
}
else {
it->second++;
}
}
it = mymap.begin();
int valor;
while (it != mymap.end()) {
if (valor == 2) {
t2 = true;
}
if (valor == 3) {
t3 = true;
}
it++;
}
if (t2) {
times2++;
}
if (t3) {
times3++;
}
}
inFile.close();
cout << "Val = " << times2 * times3 << endl;
}
#包括“cabezeras.h”
使用名称空间std;
int main()
{
字符串x;
河流充填;
boolt2,t3;
int times2=0,times3=0;
地图我的地图;
对它进行迭代器;
副副副;
infle.open(“C:/Users/victor/source/repos/AdventOfCode2018/Day2/input.txt”);
如果(!infle){
coutsecond++;
}
}
it=mymap.begin();
英勇;
while(it!=mymap.end()){
如果(valor==2){
t2=真;
}
如果(valor==3){
t3=真;
}
it++;
}
if(t2){
times2++;
}
国际单项体育联合会(t3){
times3++;
}
}
infle.close();
cout而不是使用std::find
您应该使用std::map::find
,因此请替换此选项
it = find(mymap.begin(), mymap.end(), x[i]);
与
您应该使用std::map::find
,而不是使用std::find
,因此请替换此
it = find(mymap.begin(), mymap.end(), x[i]);
与
你仍然有很多C习惯,忘掉它们吧
映射迭代器的第一个成员有一个常量
,这就是错误消息告诉您的:
auto it = mymap.find(x[i]);
或者如果你没有C++11
map<const char, int>::iterator it = mymap.find(x[i]);
你仍然有很多C习惯,忘掉它们吧
映射迭代器的第一个成员有一个常量
,这就是错误消息告诉您的:
auto it = mymap.find(x[i]);
或者如果你没有C++11
map<const char, int>::iterator it = mymap.find(x[i]);
您的代码过于复杂:
for (int i = 0; i < x.length(); i++) {
it = find(mymap.begin(), mymap.end(), x[i]);
if (it == mymap.end()) {
aux_pair = make_pair(x[i], 1);
mymap.insert(aux_pair);
}
else {
it->second++;
}
}
是专门为这种情况设计的,您可以在文档的示例代码中找到它。您的代码过于复杂:
for (int i = 0; i < x.length(); i++) {
it = find(mymap.begin(), mymap.end(), x[i]);
if (it == mymap.end()) {
aux_pair = make_pair(x[i], 1);
mymap.insert(aux_pair);
}
else {
it->second++;
}
}
是专门为这种情况设计的,您可以在文档的示例代码中找到它。这段代码:
it = find(mymap.begin(), mymap.end(), x[i]);
if (it == mymap.end()) {
aux_pair = make_pair(x[i], 1);
mymap.insert(aux_pair);
}
else {
it->second++;
}
可以用
auto insert_pair = mymap.insert({x[i], 0});
++*insert_pair.first->second;
函数返回一个std::pair
,迭代器作为第一个
值,布尔指示符作为第二个
如果插入失败,因为键x[i]
已经存在,那么first
中的迭代器将是现有元素对的迭代器。如果插入成功,则第一个
将是新插入的元素对的迭代器
由于我插入了数据值0
,如果插入成功,则增加该值将使其成为1
(这就是您插入的内容)。如果由于密钥已经存在而失败,那么我们将增加现有值(与您一样)。这段代码:
it = find(mymap.begin(), mymap.end(), x[i]);
if (it == mymap.end()) {
aux_pair = make_pair(x[i], 1);
mymap.insert(aux_pair);
}
else {
it->second++;
}
可以用
auto insert_pair = mymap.insert({x[i], 0});
++*insert_pair.first->second;
函数返回一个std::pair
,迭代器作为第一个
值,布尔指示符作为第二个
如果插入失败,因为键x[i]
已经存在,那么first
中的迭代器将是现有元素对的迭代器。如果插入成功,则第一个将是新插入的元素对的迭代器
由于我插入了数据值
0
,如果插入成功,则增加该值将使其成为1
(这就是您插入的内容)。如果由于密钥已经存在而失败,那么我们会增加现有值(就像您所做的那样)。与您的问题无关,但是为什么要使用aux\u pair
和explicitinsert
调用呢?为什么不仅仅是我们mymap[x[i]]=1
?或者最好跳过find
调用,只使用。如果密钥存在,您将获得一个对
,其中包含元素的迭代器(然后可以用于增量)和bool指示符(如果元素插入或未插入)。这与您的问题无关,但为什么要使用辅助对
和显式插入
调用?为什么不仅仅是我们mymap[x[i]]=1
?或者最好跳过find
调用,只使用。如果密钥存在,您将获得一个对
,其中包含元素的迭代器(您可以使用该迭代器进行增量),以及一个bool指示符(如果元素是否插入)。谢谢!是的,这个选项比我的容易,我将来应该使用它。在这种特殊情况下,我想我必须首先检查地图中是否存在该字符,然后增加或添加该字符。谢谢!是的,这个选项比我的容易,我将来应该使用它。在这种特殊情况下,我想我必须首先检查地图中是否存在该字符,然后增加或添加该字符。