我正在尝试使用unordered_set来跟踪某些char *元素的唯一性,但是在此范围内,unordered_set会进行修改,并且元素甚至会无缘无故消失。我在开始时和修改之前都显示了元素,但确实显示了不同的元素,我无法理解为什么。
for (unordered_set <char*> ::iterator it = unique_states.begin(); it != unique_states.end(); it++)
cout << *it << " ";
cout << endl;
set <int> state;
for (int i = 0; i < strlen(states_names[it_states]); i++)
{
int index = states_names[it_states][i] - '0';
for (set <int> ::iterator it = concatenations[index][j].begin(); it != concatenations[index][j].end(); it++)
state.insert(*it);
}
strcpy_s(temp, "");
for (set <int> ::iterator it = state.begin(); it != state.end(); it++)
{
char aux[2];
aux[0] = *it + '0';
aux[1] = '\0';
strcat_s(temp, aux);
}
int position = 0;
for (unordered_set <char*> ::iterator it = unique_states.begin(); it != unique_states.end(); it++)
cout << *it << " ";
cout << endl;
for (unordered_set <char*> ::iterator it = unique_states.begin(); it != unique_states.end(); it++)
{
cout << *it << " ";
/*if (strcmp(*it, temp) == 0)
break;*/
position++;
}
if (unique_states.count(temp) == 0)
position = it_states + 1;
cout << "Position : " << position << endl;
dfa_transitions[it_states].push_back(make_pair(j + 'a', position));
unique_states.insert(temp);
答案 0 :(得分:2)
我的猜测是问题出在您使用指针作为键集中的键。
当您将指针用作集合或地图中的键时, 指针本身 是键,而不是它们指向的数据。这意味着两个字符串(假设您的char*
指向以空值结尾的字节字符串),如果它们存储在不同的位置,它们可能与strcmp
比较相等。
如果要在地图或集合中使用字符串作为键,请改用std::string
。
答案 1 :(得分:2)
您要在unordered_set
内进行迭代。参见:https://en.cppreference.com/w/cpp/container/unordered_set/insert,尤其是:
如果由于插入而发生了哈希处理,则所有迭代器都将失效。