C++ 插入订单std::map

C++ 插入订单std::map,c++,c++11,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 =

我将创建一个关联数组(如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;
}
模板
类My_Map:public std::无序_Map
{
公众:
V和运算符[](常数K和键)
{
typename std::无序映射::迭代器uuu i=find(键);
如果(u i==std::unordered_map::end())///se non l'ho trovato。。。
{
__i=插入(uui,std::make_pair(std::move(key),V());

mHistory.push_back(u i);std::cout第一件事是不能取消对列表的结束迭代器的引用。第二,我也怀疑
yourMap.cend
是否一定可以从
yourMap.cbegin
访问

看起来您可能需要一个用于列表迭代器的适配器,该适配器自动将存储的映射迭代器指针解引用到映射项

在任何情况下,您都需要迭代列表,而不是从无序_映射中的随机点到其中的另一个随机点



另外:添加元素可能会导致重新分级,这将使迭代器失效(但不是指向元素的指针或引用)。您甚至不应该将迭代器存储到无序的\u映射中。

查看Boost.multi\u索引,这正是您所建议的。中也有链接映射。强烈建议不要像您这样从容器中派生(它们没有虚拟析构函数),和带前导下划线的变量名通常被认为是为编译器和标准库保留的。我可能错了,但我相当肯定无序映射不能确保插入顺序,如果您希望,可以使用std::vector of std::pair,但是您将无法通过键语义作为关联数组进行访问与PHP或其他语言一样。11111:下划线+大写或双下划线是由实现保留的,标准是这样说的,它们“通常不被认为”是保留的。它们是保留的,不要使用它们。@11111:他的类有一个std::list要保存(和遍历)插入顺序。有一种方法可以在不使用boost_multiindex的情况下解决此问题,使用相同的std::map插入语法?(myMap[myKey]=myValue;)