二进制'==':未找到采用'std :: pair <const _kty,_ty =“”>'类型的左操作数的运算符

时间:2018-12-04 14:49:22

标签: c++

这个错误很常见,但是我所见过的解决方案都没有一个对我有用。

我看到的解决方案是使用其他类型的操作数,而不是使用对,但这不是借口。

我在错误中了解到的是,我没有用对定义相等的运算符,但是我随时都不会比较对,我一直在使用键或值。

#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;
}

调试时(将我带到xutility文件中):

template<class _InIt, class _Ty> inline
_InIt _Find_unchecked1(_InIt _First, const _InIt _Last, const _Ty& _Val, false_type)
{   // find first matching _Val
    for (; _First != _Last; ++_First)
        if (*_First == _Val) // THIS IS THE LINE OF THE ERROR
            break;
    return (_First);
}

4 个答案:

答案 0 :(得分:2)

您应该使用std::find而不是使用std::map::find,所以请替换

it = find(mymap.begin(), mymap.end(), x[i]);

使用

it = mymap.find(x[i]);

答案 1 :(得分:1)

您仍然有很多C习惯,请忘记它们。

地图迭代器的第一个成员有一个const,这就是错误消息告诉您的内容:

auto it = mymap.find(x[i]);

或者如果您没有C ++ 11

map<const char, int>::iterator it = mymap.find(x[i]);

但是不要在一开始就声明所有变量,请放开这个习惯,在适当的范围内在需要它们的地方声明它们。

如果以后需要另一个it,请使用另一个auto,可能值得为更具描述性的名称更改名称。

但是正如Slava所说的,map的默认初始化程序说,您可以这样做:

for (char c : x ) ++mymap[c];

答案 2 :(得分:1)

您会使代码过于复杂:

    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++) 
    mymap[ x[i] ]++;

或更短的用于范围循环:

for (char c : x ) mymap[c]++;

std::map::operator[]专为此类情况设计,您可以在文档的示例代码中找到它。

答案 3 :(得分: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;

Fiddle函数返回一个std::pair,并将迭代器作为first的值并将布尔指示符作为second

如果插入失败,因为键x[i]已经存在,则first中的迭代器将是现有元素对的迭代器。如果插入成功,则first将成为新插入的元素对的迭代器。

自从我插入数据值0以来,如果插入成功,则增加该值将使其成为1(这就是您插入的内容)。如果由于密钥已经存在而导致失败,那么我们会增加现有值(就像您一样)。