c++ - 包含迭代器到 vector 的无序映射 - 迭代器不可取消引用 C++

标签 c++ vector iterator unordered-map

我有一个无序映射,它将一个字符串存储为它的键,将一个迭代器存储到一个 vector 中的一个点作为它的数据。 vector 中的每个元素都包含一个字符串和一个整数(字符串出现的次数)。我编写了一个 increaseCount(std::string, int) 函数,它应该将新字符串插入无序映射中,除非它已经在容器中。如果是这种情况,函数应该在无序映射中找到键,到达迭代器指向的 vector 中的相应位置,并将 vector 元素的 int 参数加一。但是,在执行第二种情况时,出现错误“Vector iterator not dereferencable”。这是我编写的代码。

void ourTrends::increaseCount(std::string s, unsigned int amount){
// check to see if key is already in
if(wordStoreTable.find(s) == wordStoreTable.end()){
    // add the element into the hash table
    std::vector<std::pair<std::string, int>>::iterator it;
    std::pair<std::string, std::vector<std::pair<std::string, int>>::iterator> word (s, it);
    wordStoreTable.insert(word);

    // add element to back of vector
    std::pair<std::string, int> p1 (s, amount);
    sortedVector.push_back(p1);
    //std::swap(sortedVector.front(), sortedVector.back());
    // set the iterator of the hash pair to the end of the current vector size
    it = sortedVector.end();
    --it;
    wordStoreTable.find(s)->second = it;
    isSorted = false;

} else{
    int x = wordStoreTable.find(s)->second->second;
    std::pair<std::string, int> p1 (s, x + amount);
    sortedVector.erase(wordStoreTable.find(s)->second);
    sortedVector.push_back(p1);
    //std::swap(sortedVector.begin(), sortedVector.end());
    std::vector<std::pair<std::string, int>>::iterator it = sortedVector.end();
    --it;
    wordStoreTable.find(s)->second = it;
    std::cout << wordStoreTable.find(s)->first << std::endl;

}

我知道这意味着迭代器指向内存中的一个空位置,但我不知道它在哪里丢失了目标。

最佳答案

此代码不起作用的原因是 vector::push_back 使迭代器无效,也就是说,如果您通过添加新元素使 vector 变大,则您拥有的用于大小为 3 的 vector 的迭代器可能无法工作.来自 cppreference:如果新的 size() 大于 capacity() 则所有迭代器和引用(包括尾后迭代器)都将失效。否则只有尾后迭代器无效。

您当然可以提前为 vector 保留足够的空间,这样迭代器就不会失效,但作为一般规则,您最好使用数字索引。

关于c++ - 包含迭代器到 vector 的无序映射 - 迭代器不可取消引用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128823/

相关文章:

c++ STL容器存储了一个重载operator =的类

ios - 投影矩阵有什么用?

c++ - 添加字符串 vector 和不同数据类型 vector 的映射

c++ - 通过类型转换切掉重写的方法

c++ - 如何在 QGridLayout 中正确对齐 QLabel?

c++ - Redis Set中一个成员占用多少字节

c++ - 所有双向迭代器的通用类类型,c++

c++ - 纹素中心的采样没有给出正确的结果,OpenGL,C++

java - 在 Java 中展平迭代器的迭代器

C++ STL unordered_map迭代器问题