Вставить заказ std :: map - PullRequest
       5

Вставить заказ std :: map

0 голосов
/ 26 ноября 2011

Я бы создал ассоциативный массив (например, 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 смешивает итераторы, когда я вставляю новый элемент.

В этом коде есть проблема: for in main () завершается с ошибкой сегментации. Итераторы, переданные с помощью cbegin () и cend (), недопустимы ... почему? Что не так?

1 Ответ

2 голосов
/ 26 ноября 2011

Первое, что вы не можете разыменовать конечный итератор списка.Во-вторых, я также сомневаюсь, что yourMap.cend будет обязательно доступен из yourMap.cbegin.

Похоже, вам может понадобиться адаптер для итератора списка, который автоматически разыменовывает хранимый указатель map итератор для отображения элемента.

В любом случае вам нужно выполнить итерацию по списку, а не от случайной точки в unordered_map к другой случайной точке в ней.


Также: добавление элементов можетвызвать перефразировку, которая сделает недействительными итераторы (но не указатели или ссылки на элементы).Вы не должны даже хранить итераторы в unordered_map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...