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
和explicit
insert
调用呢?为什么不仅仅是我们
mymap[x[i]]=1
?或者最好跳过
find
调用,只使用。如果密钥存在,您将获得一个
,其中包含元素的迭代器(然后可以用于增量)和bool指示符(如果元素插入或未插入)。这与您的问题无关,但为什么要使用
辅助对
和显式
插入
调用?为什么不仅仅是我们
mymap[x[i]]=1
?或者最好跳过
find
调用,只使用。如果密钥存在,您将获得一个
,其中包含元素的迭代器(您可以使用该迭代器进行增量),以及一个bool指示符(如果元素是否插入)。谢谢!是的,这个选项比我的容易,我将来应该使用它。在这种特殊情况下,我想我必须首先检查地图中是否存在该字符,然后增加或添加该字符。谢谢!是的,这个选项比我的容易,我将来应该使用它。在这种特殊情况下,我想我必须首先检查地图中是否存在该字符,然后增加或添加该字符。