Итерация по контейнеру unique_ptr

Как получить доступ к элементам unique_ptr контейнера (через итератор), не забирая владение у контейнера? Когда кто-то получает итератор для элемента в контейнере, остается ли право собственности на элемент у контейнера? Как насчет того, чтобы разыменовать итератор, чтобы получить доступ к unique_ptr? Выполняется ли при этом неявное перемещение unique_ptr?

Я обнаружил, что часто использую shared_ptr, когда мне нужно хранить элементы в контейнере (не по значению), даже если контейнер концептуально владеет элементами, а другой код просто желает для манипулирования элементами в контейнере, потому что я боюсь, что не смогу получить доступ к элементам unique_ptr в контейнере, не забирая у него право собственности.

Есть какие-нибудь идеи?

27
задан Chris 13 August 2013 в 01:12
поделиться

1 ответ

Пока вы не пытаетесь сделать копию unique_ptr, вы можете просто использовать ее. Вам нужно будет «дважды разыменовать» итератор, чтобы получить значение указателя, как это было бы с shared_ptr. Вот краткий пример:

#include <vector>
#include <memory>
#include <iostream>

template <class C>
void
display(const C& c)
{
    std::cout << '{';
    if (!c.empty())
        std::cout << *c.front();
    for (auto i = std::next(c.begin()); i != c.end(); ++i)
        std::cout << ", " << **i;
    std::cout << "}\n";
}

int main()
{
    typedef std::unique_ptr<int> Ptr;
    std::vector<Ptr> v;
    for (int i = 1; i <= 5; ++i)
        v.push_back(Ptr(new int(i)));
    display(v);
    for (auto i = v.begin(); i != v.end(); ++i)
        **i += 2;
    display(v);
}

Если вы (случайно) сделаете копию unique_ptr:

Ptr p = v[0];

, вы узнаете это во время компиляции. Это не приведет к ошибке во время выполнения. Ваш вариант использования - то, почему container<unique_ptr<T>> был построен. Вещи должны просто работать, и если они этого не делают, проблема появляется во время компиляции, а не во время выполнения. Поэтому удалите код, и если вы не понимаете ошибку времени компиляции, задайте еще один вопрос здесь.

16
ответ дан 28 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

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