У меня есть 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
.
Вы сделали бы это этот путь, или действительно ли это - плохая идея?
Спасибо!
Если у вас уже есть отсортированный список, отсортированный в соответствии с предикатом Предикат
, вы можете просто сделать следующее:
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());
Я бы просто перебирал список и вставлял каждую пару в карту или использовал изящный метод, описанный Лютером Блиссеттом.
Тот факт, что я не понимаю, что вы пытаетесь сделать, означает, что это либо приведет к нечитаемому коду, либо вы ошибетесь.
Почему вы так делаете?
Можете ли вы изменить код, чтобы в первую очередь возвращать вам карту вместо списка?
Вы можете использовать std :: copy и std :: insertter:
std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));
, потому что итератор для списка