查找地图 C++ 未找到已添加到地图中的键
find map c++ is not finding key already added in the map
地图 cidades 开始是空的。
将 txt 文件视为:
" city1, city2 "
当城市不在地图中时,应该添加一个随机数的城市,即计数
代码如下:
int i,cont = 0; // i is used as a flag and count do add a key reference when I add a new element in the map
string line; // used to get everything untill the comma
map<string,int> cidades; // map of cities and their references .. like cidades<"Silicon Valley", 1>
ifstream arquivoTexto ("text.txt");
if (arquivoTexto.is_open()) { // open file
while (getline (arquivoTexto,line)){ // while EOF is false
stringstream element(line); i = 1; // i is always 1 when checking a new line
while(getline(element, line, ',')){ // line is the string untill the comma
if(i == 1) { // i = 1 means the current line is the city one
std::map<std::string, int>::iterator it = cidades.find(line); // try to find the current city in the map
if(cidades.empty()){ // insert first time because map is empty
cidades.insert(pair<string,int>(line,cont));
}
else if(it == cidades.end()){ // insert because is not in the map
cidades.insert(pair<string,int>(line,cont));
c1 = cont;
}else{ // get the key because is already in the map
c1 = cidades.at(line);
}
} else if( i == 2) {
// line is holding city 2, do the same above
}
cont++; i++; // increase i to tell we are working with the next string after the comma
}
但是当我将相同的代码从上面的条件语句中取出时..它起作用了
string a = "teste"; // taken from the txt and added into the map
std::map<std::string, int>::iterator it = cidades.find(a);
cout << "ele: " << it->first << " chave: " << it->second;
它打印 teste 和密钥...但是当我尝试在里面打印时,如果出现分段错误(核心已转储)。
编辑:
我的程序找不到地图中已有的键。
当我在 if 语句中比较迭代器时,它看起来像 none 键在映射中(即使键已经在上面,然后它再次添加相同的键和另一个整数引用)。所以现在我想找出另一种在地图中查找键的方法,有什么好主意吗?
可能是因为没有找到line
,在这种情况下it
将被设置为map::end,我认为这基本上意味着它设置为'NULL'或一些无效的位置,这意味着你不应该取消引用它,即:it->first
(因此出现分段错误)(从技术上讲,如果你取消引用从 find
返回的迭代器,当它没有找到任何东西时,会发生什么,是未定义的行为,即不要这样做。),
http://www.cplusplus.com/reference/map/map/find/
不要在此处执行 cout
,在下面的 'else' 中执行,您知道 it
指向的是有效项目。
地图 cidades 开始是空的。
将 txt 文件视为:
" city1, city2 "
当城市不在地图中时,应该添加一个随机数的城市,即计数
代码如下:
int i,cont = 0; // i is used as a flag and count do add a key reference when I add a new element in the map
string line; // used to get everything untill the comma
map<string,int> cidades; // map of cities and their references .. like cidades<"Silicon Valley", 1>
ifstream arquivoTexto ("text.txt");
if (arquivoTexto.is_open()) { // open file
while (getline (arquivoTexto,line)){ // while EOF is false
stringstream element(line); i = 1; // i is always 1 when checking a new line
while(getline(element, line, ',')){ // line is the string untill the comma
if(i == 1) { // i = 1 means the current line is the city one
std::map<std::string, int>::iterator it = cidades.find(line); // try to find the current city in the map
if(cidades.empty()){ // insert first time because map is empty
cidades.insert(pair<string,int>(line,cont));
}
else if(it == cidades.end()){ // insert because is not in the map
cidades.insert(pair<string,int>(line,cont));
c1 = cont;
}else{ // get the key because is already in the map
c1 = cidades.at(line);
}
} else if( i == 2) {
// line is holding city 2, do the same above
}
cont++; i++; // increase i to tell we are working with the next string after the comma
}
但是当我将相同的代码从上面的条件语句中取出时..它起作用了
string a = "teste"; // taken from the txt and added into the map
std::map<std::string, int>::iterator it = cidades.find(a);
cout << "ele: " << it->first << " chave: " << it->second;
它打印 teste 和密钥...但是当我尝试在里面打印时,如果出现分段错误(核心已转储)。
编辑: 我的程序找不到地图中已有的键。 当我在 if 语句中比较迭代器时,它看起来像 none 键在映射中(即使键已经在上面,然后它再次添加相同的键和另一个整数引用)。所以现在我想找出另一种在地图中查找键的方法,有什么好主意吗?
可能是因为没有找到line
,在这种情况下it
将被设置为map::end,我认为这基本上意味着它设置为'NULL'或一些无效的位置,这意味着你不应该取消引用它,即:it->first
(因此出现分段错误)(从技术上讲,如果你取消引用从 find
返回的迭代器,当它没有找到任何东西时,会发生什么,是未定义的行为,即不要这样做。),
http://www.cplusplus.com/reference/map/map/find/
不要在此处执行 cout
,在下面的 'else' 中执行,您知道 it
指向的是有效项目。