Как преобразовать элемент c ++ std :: list в мультикартный итератор - PullRequest
0 голосов
/ 23 марта 2009

у меня

std::list<multimap<std::string,std::string>::iterator> >

Теперь у меня есть новый элемент:

multimap<std::string,std::string>::value_type aNewMmapValue("foo1","test")

Я хочу избежать необходимости устанавливать временную мультикарту и выполнять вставку в новый элемент, чтобы вернуть его итератор так что я мог бы вернуть его обратно к:

std::list<multimap<std::string,std::string>::iterator> >

Могу ли я как-нибудь избежать этого создания временного мультикарты. Спасибо

Ответы [ 4 ]

2 голосов
/ 23 марта 2009

Вам нужно вставить пару ключ-значение в мультикарту, прежде чем получить для нее итератор.

Итератор не работает сам по себе. Если вы храните итераторы из нескольких разных мультикарт, вам, вероятно, нужно хранить в списке больше, чем просто итератор.

Возможно:

  1. a pair<multimap<std::string,std::string>::iterator, multimap<std::string,std::string>::iterator>, где first - итератор, а second - конечный итератор.

  2. a pair<multimap<std::string,std::string>::iterator, multimap<std::string,std::string>*> где first - итератор, а second - указатель на мультикарту, к которой принадлежит итератор.

  3. другое решение.

РЕДАКТИРОВАТЬ: Я согласен с Николаем Голубевым: часто плохая идея хранить итераторы в течение более длительного периода времени, так как итераторы могут быть недействительными.

2 голосов
/ 23 марта 2009

Вы не указали тип данных, который вы храните в вашем list. В любом случае, предполагая, что вы хотите добавить значения, на которые указывает определенный ключ, вы можете вызвать list.insert(*mapIter).

multimap<std::string,std::string>::value_type aNewMmapValue("foo1","test")

Вам необходимо добавить это в свою мультикарту через map.insert. Эта функция возвращает итератор. Затем вы можете безопасно добавить этот итератор в свой список.

std::list<multimap<std::string,std::string>::iterator> yourlist;
// ....
multimap<std::string,std::string>::iterator itr = 
                               yourmultimap.insert(aNewMmapValue);
yourlist.insert(itr);
1 голос
/ 10 апреля 2010

Не хранить итераторы. Используйте либо константные итераторы, либо лучше хранить указатели на элементы на карте.

1 голос
/ 23 марта 2009

Тип std::multimap<std::string,std::string>::iterator является итератором для std::pair<const std::string, std::string> , хранящимся в std :: multimap . Если элемент не хранится в мультикарте, на него нельзя ссылаться через итератор мультикарты.

Возможно, вы захотите хранить вместо него std::list<std::pair<std::string,std::string> >.

...