Как преобразовать отсортированный станд.:: список станд.:: пара к станд.:: карта

У меня есть a std::list< std::pair<std::string,double> >, то, которое я знаю, отсортировано согласно std::string element.

Так как я хотел бы сделать много из std::find_if на основе std::string элемент, я верю a std::map<string,double,MyOwnBinaryPredicate> с lower_bound и upper_bound больше соответствовал бы.

Факт - то, что я хочу insert элементы в std::map эффективным способом. Таким образом, я хочу использовать дополнительный итератор для создания insert быстрее.

Я полагаю, что самый легкий путь состоял бы в том, чтобы использовать a const_reverse_iterator пройти std::list и использовать begin() из std::map.

Вы сделали бы это этот путь, или действительно ли это - плохая идея?

Спасибо!

7
задан NullUserException 5 August 2010 в 07:36
поделиться

3 ответа

Если у вас уже есть отсортированный список, отсортированный в соответствии с предикатом Предикат , вы можете просто сделать следующее:

std::list< std::pair<std::string, double> > sorted_list;
std::map<string, double, Predicate> map(sorted_list.begin(), sorted_list.end());

Карта ] конструктор имеет линейную временную сложность, если ваш список уже отсортирован, иначе O (n * log n). После этого вы можете работать непосредственно с картой, как и с любой другой.

Если позже вы захотите вернуть результаты в свой список, вы можете сделать наоборот:

sorted_list.assign(map.begin(), map.end());
11
ответ дан 6 December 2019 в 14:00
поделиться

Я бы просто перебирал список и вставлял каждую пару в карту или использовал изящный метод, описанный Лютером Блиссеттом.
Тот факт, что я не понимаю, что вы пытаетесь сделать, означает, что это либо приведет к нечитаемому коду, либо вы ошибетесь.
Почему вы так делаете?
Можете ли вы изменить код, чтобы в первую очередь возвращать вам карту вместо списка?

0
ответ дан 6 December 2019 в 14:00
поделиться

Вы можете использовать std :: copy и std :: insertter:

std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));  

, потому что итератор для списка имеет тип значения, совместимый с итераторами map .

4
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: