簡體   English   中英

插入命令std :: map

[英]Insert order std::map

我將創建一個關聯數組(如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()傳遞的迭代器無效......為什么? 怎么了?

第一件事是你不能取消引用列表的結束迭代器。 其次,我還懷疑你的yourMap.cend是否必須從你的yourMap.cbegin可以訪問。

看起來您可能需要一個適配器用於列表迭代器,它自動解除引用存儲的 映射迭代器 指向映射項的指針。

在任何情況下,您都需要遍歷列表,而不是從unordered_map中的隨機點迭代到其中的另一個隨機點。


另外:添加元素會導致重新散列,這會使迭代器無效 (但不會指針或對元素的引用)。 您甚至不應該將迭代器存儲到unordered_map中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM