LINUX.ORG.RU

Как скопировать элементы из одного контейнера в другой

 , , ,


0

1

Добрый вечер, есть контейнеры с умными указателями, как их в другой контейнер перенести, желательно как-нибудь с предикатом навроде copy_if

#include <vector>
#include <memory>
using namespace std;

struct A {
    A(int val) : mVal(val) {

    }
    ~A() {

    }
    int val() const {
        return mVal;
    }
    private:
        int mVal;
};
int main(int argc, char *argv[])
{

    shared_ptr<A> a1 = make_unique<A> (3);
    shared_ptr<A> a2 = make_unique<A> (6);
    shared_ptr<A> a3 = make_unique<A> (9);
    vector<unique_ptr<A>> v1;
    vector<unique_ptr<A>> v2;
    v1.push_back( std::move(a1) );
    v1.push_back( std::move(a2) );
    v1.push_back( std::move(a3) );
}
Мне нужно в вектор v2 перенести элементы из v1 которые больше некоего значения.



Последнее исправление: da17 (всего исправлений: 3)

Ты же в курсе, что пытаешь засунуть shared в unique?

pon4ik ★★★★★
()

У тебя векторы с unique_ptr, а ты туда пытаешься shared_ptr запихнуть, еще бы оно компилилось.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Допустим что там unique, если я пост поправлю, как-то непонятно вопросы будут смотреться. Везде unique_ptr, описался. В общем я подправлю тогда.

da17
() автор топика
Последнее исправление: da17 (всего исправлений: 1)
Ответ на: комментарий от da17

Как-то так (не запускал):

#include <algorithm>
#include <vector>
#include <memory>
using namespace std;

struct A {
    A(int val) : mVal(val) {

    }
    ~A() {

    }
    int val() const {
        return mVal;
    }
    private:
        int mVal;
};
int main(int argc, char *argv[])
{

    unique_ptr<A> a1(new A(3));
    unique_ptr<A> a2(new A(6));
    unique_ptr<A> a3(new A(9));
    vector<unique_ptr<A>> v1;
    vector<unique_ptr<A>> v2;
    v1.push_back( std::move(a1) );
    v1.push_back( std::move(a2) );
    v1.push_back( std::move(a3) );

    std::copy_if(make_move_iterator(v1.begin()),
                 make_move_iterator(v2.end()),
                 back_inserter(v2), [](const unique_ptr<A> &a) { return true; });
}
xaizek ★★★★★
()

std::remove_if перенесет элементы в конец вектора и вернёт итератор на начало последовательности перенесенных элементов, std::move перенесет элементы этой последовательности в новый вектор, erase удалит элементы из исходного вектора.

iliyap ★★★★★
()
Последнее исправление: iliyap (всего исправлений: 1)
Ответ на: комментарий от zerhud

Спасибо, обязательно посмотрю, а вот еще у меня вопрос, можно ли по контейнеру из unique_ptr пробежаться?

foreach(auto el : some_vector ) { cout << el->value() << endl; }

Я не до конца понимаю эту тему, а все статьи которые удалось почитать достаточно поверхностны и есть только базовые случае.

da17
() автор топика
Последнее исправление: da17 (всего исправлений: 4)
Ответ на: комментарий от da17

да, только auto в данном случае будет unique_ptr<T> так что это не скомпилится (ну то есть тут будет требоватся копия, что запрещено в unique_ptr). нужно писать auto& или auto&&

для этого собственно и сделан boost ptr_container, чтобы не было всякого гемороя при проходе по контейнеру, обращении по итератору.. в частности чтобы обратится по итератору к элементу нужно использовать операторы стрелку или звездочку. но они обратятся к unique_ptr<T>, и дальше придется использовать еще одну стрелочку или звездочку. ptr_container лишен этого недостатка.

zerhud
()
Ответ на: комментарий от zerhud

в частности чтобы обратится по итератору к элементу нужно использовать операторы стрелку или звездочку. но они обратятся к unique_ptr, и дальше придется использовать еще одну стрелочку или звездочку

Со стрелками ты переврал. Достаточно одного применения -> и operator-> вызывается по цепочке пока не получится выражение с типом для которого -> не перегружен.

anonymous
()
Ответ на: комментарий от zerhud

Хорошо, а если я не хочу подключать к проекту boost можно ли как-нибудь средствами stl. Если у меня есть вектор unique_ptr то получается без boost ptr_container я должен по индексу обращаться и будет что-то v[i]->doSomething()

da17
() автор топика
Ответ на: комментарий от da17

Да, похоже на правду. Только имей ввиду, что это накладывает определенные ограничения: копировать нельзя, с итреторами трудности.. а так что, все возможно. Главное запутавшись не ошибиться.

zerhud
()
Ответ на: комментарий от zerhud

Да, я понял. Прост я чёт подумал у итераторов перегружен operator-> и не проверил это.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.