Как преобразовать сортированный 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 описал.
Тот факт, что я не понимаю, что вы пытаетесь сделать, означает, что это приведет либо к нечитаемому коду, либо к тому, что вы далеко.
Почему ты так поступаешь?
Можете ли вы изменить код, чтобы вернуть вам карту вместо списка в первую очередь?