我的unordered_set元素在范围内更改而不修改它们

时间:2019-04-15 07:27:46

标签: c++

我正在尝试使用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);

2 个答案:

答案 0 :(得分:2)

我的猜测是问题出在您使用指针作为键集中的键。

当您将指针用作集合或地图中的键时, 指针本身 是键,而不是它们指向的数据。这意味着两个字符串(假设您的char*指向以空值结尾的字节字符串),如果它们存储在不同的位置,它们可能与strcmp比较相等。

如果要在地图或集合中使用字符串作为键,请改用std::string

答案 1 :(得分:2)

您要在unordered_set内进行迭代。参见:https://en.cppreference.com/w/cpp/container/unordered_set/insert,尤其是:

  

如果由于插入而发生了哈希处理,则所有迭代器都将失效。