Используйте std :: find в QVector <std :: unique_ptr <Type>> - PullRequest
0 голосов
/ 26 октября 2018

Код

Ниже приведена уменьшенная реализация класса, с которым у меня возникают проблемы:

class Dummy{
public:
    Dummy();
    ~Dummy();
    void addItem(std::unique_ptr<Type>&& item);
private:
    QVector<std::unique_ptr<Type>> collection;
}

Type, приведенный во фрагменте кода выше, является другим классом, которыйподдерживает семантику перемещения.Вот реализация addItem члена:

void Dummy::addItem(std::unique_ptr<Type>&& item){
    if((std::find(collection.begin(), collection.end(), item) == colection.end()){
        collection.push_back(std::move(item));
    }
}

Я использую класс Dummy следующим образом:

Dummy myDummy;
std::unique_ptr<Type> item(new Type());
myDummy.addItem(sdt::move(item));

Проблема

Компилятор сообщаетследующее:

required from 'QVector<T>::iterator QVector<T>::begin()'
required from here
use of deleted function 'std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&)'

Означает ли это, что я не могу выполнить итерацию с предоставленными итераторами над QVector<std::unique_ptr<Type>> и, следовательно, не могу использовать std::find, предоставленный заголовком алгоритма?
Я мог бы использовать базу диапазонадля for(auto const& other : collection) и реализовать оператор равенства для Type, чтобы получить поведение от std::find.
Я не могу понять, где пример идет не так.

1 Ответ

0 голосов
/ 26 октября 2018

Проблема в том, что QVector копирует (копирует конструкции) его элементы, когда вы:

  • добавляете их с помощью функции push_back().
  • Получите непостоянный итератор вконец контейнера.

Чтобы избежать второго, вы должны использовать довольно постоянные итераторы, то есть QVector::constBegin() и QVector::constEnd(), то есть

if (std::find(collection.constBegin(), collection.constEnd(), item) == collection.constEnd()) {...}

Чтобы избежать копирования при добавлении... хм, я бы посоветовал использовать вместо std::vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...