插入命令std :: map

时间:2011-11-26 17:04:02

标签: c++ c++11

我会创建一个关联数组(如std :: map),按插入顺序存储元素。我写了这堂课:

template <typename K, typename V>
class My_Map : public std::unordered_map<K,V>
{
 public:
 V& operator[]( const K&& key )
  {
    typename std::unordered_map<K,V>::iterator __i = find(key);
    if (__i == std::unordered_map<K,V>::end()) //se non l'ho trovato...
    {
      __i = insert(__i, std::make_pair(std::move(key), V()) );
      mHistory.push_back(__i);std::cout<<"Sto inserendo: "<<key<<std::endl;
    }
    return (*__i).second;
  }

  typename std::unordered_map<K,V>::iterator cbegin() const
  {
        return *mHistory.cbegin();
  }

  typename std::unordered_map<K,V>::iterator cend() const
  {
      return *mHistory.cend();
  }

  private:
    std::list<typename std::unordered_map<K,V>::iterator> mHistory;
};

using namespace std;

int main()
{
    My_Map<string,int> myMap;


    myMap["1"] = 1;
    myMap["23"] = 23;
    myMap["-3"] = 3;
    myMap["23"] = 28;
    myMap["last element"] = 33;

    for (auto x = myMap.cbegin(); x != myMap.cend(); ++x)//{std::cout<<"sn dentro\n";}
        cout<<(*x).first <<"\t"<<x->second<<endl;
}

我使用了unordered_map而不是std :: map,因为当我插入新元素时std :: map混合迭代器。

此代码存在问题:main()中的for失败并出现分段错误。用cbegin()和cend()传递的迭代器无效......为什么?怎么了?

1 个答案:

答案 0 :(得分:2)

首先,您不能取消引用列表的结束迭代器。其次,我还怀疑yourMap.cend是否必须从yourMap.cbegin可以获得。

看起来你可能需要一个适配器用于列表迭代器,它自动解除引用存储的 map iterator 指向map项的指针。

在任何情况下,您都需要遍历列表,而不是从unordered_map中的随机点迭代到其中的另一个随机点。


另外:添加元素会导致重新散列,这会使使迭代器无效(但不会指针或对元素的引用)。您甚至不应该将迭代器存储到unordered_map中。