порядок в std :: set уникальных указателей - PullRequest
1 голос
/ 02 августа 2020

У меня есть std :: set уникальных указателей в классе вроде std::set<std::unique_ptr<T>> my_set{};, и я хочу написать метод, который создает отсортированный вектор значений, на которые указывают эти уникальные указатели.

В настоящее время У меня есть:

auto convert() -> std::vector<T> {
            auto vec = std::vector<T>();
            for (auto const& element : my_set) {
                vec.push_back(element.get());
            }
            return vec;
        }

Однако я не уверен, что это приведет к требуемой сортировке, которую я хочу? Кто-нибудь знает, как я могу отсортировать указатели в наборе таким образом, чтобы указанные значения располагались в порядке возрастания (что означает, что я могу просто вернуть sh каждый из них обратно в набор)?

EDIT: чтобы сделать вопрос можно ли использовать std::transform(my_set.begin(), my_set.end(), vec.begin(), [](std::unique_ptr<T> ptr) -> T { return ptr.get(); });?

1 Ответ

1 голос
/ 02 августа 2020

Набор сортируется по значению указателя, а не по значениям; поэтому вам нужно отсортировать результат после (обратите внимание, что могут быть дубликаты, потому что указатели относятся к уникальным экземплярам, ​​но указанные значения могут быть эквивалентными для отношения порядка на T).

Я действительно нахожу этот дизайн довольно запутанный ... если вы заботитесь об идентичности (чтобы у вас были уникальные указатели), как возможно, что можно использовать std::vector<T>, который является контейнером значений (т.е. идентичность не имеет значения)?

...