2016-10-20 1 views
1

Я новичок в жизни объекта C++, так что несите меня.C++ vector: push_back массив int => Скомпилирован ли массив?

У меня есть вектор динамически выделенные массивы целых чисел: std::vector<int*>

This page говорит «Содержание Вала копируется (или перемещено) к новому элементу.»

Что я понимаю из этого, то, что я вдавливаю в массив, МОЖЕТ быть перемещен или скопирован, но когда он перемещается и когда он копируется?

Я подозреваю, что оцененное копируется, если оно имеет примитивные типы? Например, int, char и т. Д.?

И копируется в противном случае? Означает ли это, что мой массив будет «перемещен»?

===================

EDIT 1: то, что я пытаюсь выяснить, что я предполагаю передать вектор в функцию , В этой функции я выделяю массив целых чисел и вставляю его в вектор. Как только функция вернется, и я вернусь к вызывающей стороне, могу ли я безопасно получить доступ к массиву, который был просто введен в вектор?

EDIT 2: некоторые предложили использовать vector<vector<int>>, поэтому мой вопрос стал, если я передаю «родительский» вектор в некоторую функцию. В этой функции я создаю внутренний вектор и вставляю его во внешний вектор. Когда я вернусь к вызывающей стороне, могу ли я безопасно получить доступ к новому внутреннему вектору, который был просто введен во внешний вектор? Что-то вроде этого:

void foo() 
{ 
    vector<vector<int>> parentV; 
    addVect(parentV); 

    //Is is safe to access parentV[0][0] here? 
} 


void addVect(vector<vector<int>> &parentV) 
{ 
    vector<int> child; 
    child.push_back(1); 
    child.push_back(2); 
    parentV.push_back(child); 
} 
+0

Там * почти * нет причин на земле иметь «вектор» указателей на целые числа. Я не могу думать ни о чем. – SergeyA

+0

Одним из вариантов было бы использовать 'std :: vector >', чтобы избавиться от динамически выделенного массива. –

+0

Иногда он может быть полезен в качестве «индексатора строк» ​​при моделировании матрицы. – Bathsheba

ответ

1

некоторые из предложенных с использованием вектора>, поэтому мой вопрос стал, если я передаю «родительский» вектор в некоторую функцию. В этой функции I создайте внутренний вектор и вставьте его во внешний вектор. Когда я буду обратно к вызывающему абоненту, могу ли я безопасно получить доступ к новому внутреннему вектору , который был просто вдавлен во внешний вектор?

void foo() 
{ 
    vector<vector<int>> parentV; 
    addVect(parentV); 

    //Is the "child" vector still safe for access here? 
} 


void addVect(vector<vector<int>> &parentV) 
{ 
    vector<int> child; 
    child.push_back(1); 
    child.push_back(2); 
    parentV.push_back(child); 
} 

Чтобы ответить:

вектор "ребенок" по-прежнему безопасно для доступа здесь?

Нет и да.

Нет, не по имени child как минимум. child является местным для addVect, и таким образом foo ничего не узнает об этом. Он будет уничтожен после возвращения addVect.

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

auto copyOfChild = *parentV.rbegin(); //get the last vector since push_back adds to the end of the vector 

или

auto copyOfChild = parentV[parentV.size() - 1]; //get the last vector since push_back adds to the end of the vector 
+0

Ах право. Я имел в виду, если бы я мог получить доступ к «VALUE» дочернего вектора. Нет, мне не нужно обращаться к «ребенку». Просто его ценность. – 0x56794E

+1

Подождите, что? Вектор копируется в 'parentV'. Вы можете получить доступ к нему в колл. – NathanOliver

+0

@ 0x56794E Да, значения копируются в 'parentV', и вы можете получить доступ к этому вектору. –

1

указатель хранится в векторе может быть перемещен, но адрес он указывает не будет, а это значит, ваши данные никогда не двигаться. Если бы у вас были фактические ints в векторе, а затем был адресован одному из них, этот указатель мог бы быть недействительным, если бы вектор был перераспределен, но поскольку только указатель хранится в векторе, ваши фактические ints в массивы никогда не будут перемещены.

0

, но когда он перемещается, и когда он копируется?

Он базируется на типе ценности, который вы передаете. Например std::vvector::push_back() имеет 2 overrides:

void push_back(const T& value); 
void push_back(T&& value); 

так что если вы передаете тип, который может связываться с RValue refence, то второй метод вызывается и объект перемещается. В противном случае вызывается первый метод и копируется объект.

Я подозреваю, что оцененное копируется, если оно имеет примитивные типы? Например, int, char и т. Д.? не

Нет это зависит от типа значения, не если примитивный тип и т.д. Например:

std::vector<Foobar> vec; 
Foobar f; 
vec.push_back(Foobar()); // temporary binds to rvalue, move 
vec.push_back(f); // value copied 
vec.push_back(std::move(f)); // now f moved 

ли это, что означает, что мой массив будет «переехал»?

Нет, ваш массив не может быть перемещен. Вектор мог перемещать только переменную, которая передавалась ему. Ваша переменная - это указатель, а не массив. Перемещение исходного указателя совпадает с копированием одного указателя на другой.