包含Iterator到Vector的无序映射 - Iterator而不是Dereferencable C ++

时间:2014-11-25 14:05:34

标签: c++ vector iterator unordered-map

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

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;

}

}

我知道这意味着迭代器指向内存中的空位置,但我无法弄清楚它在何处失去对其目的地的跟踪。

1 个答案:

答案 0 :(得分:2)

这段代码不起作用的原因是,vector :: push_back使迭代器无效,也就是说,对于大小为3的向量的迭代器,如果通过添加一个向量来增大向量,则可能无效新元素。从cppreference:如果new size()大于capacity(),那么所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。

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