Как преобразовать сортированный std:: список std:: pair в std:: map

у меня есть std::list< std::pair<std::string,double> >, который я знаю, сортируется в соответствии с std::string element.

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

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

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

вы бы сделали это таким образом, или это плохая идея?

спасибо!

3 ответов


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

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

на map конструктор имеет линейную временную сложность, если ваш список уже отсортирован, o (n*log n) в противном случае. Затем вы можете работать непосредственно с картой, как и с любой другой.

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

sorted_list.assign(map.begin(), map.end());

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

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

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


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