这个错误很常见,但是我所见过的解决方案都没有一个对我有用。
我看到的解决方案是使用其他类型的操作数,而不是使用对,但这不是借口。
我在错误中了解到的是,我没有用对定义相等的运算符,但是我随时都不会比较对,我一直在使用键或值。
#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);
}
答案 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
(这就是您插入的内容)。如果由于密钥已经存在而导致失败,那么我们会增加现有值(就像您一样)。