2013-07-03 2 views
0

Это может быть слишком просто, но я хотел бы спросить. У меня есть код на Java, который копирует массив start в newStart и присваивает последний элемент другому массиву.Копирование массивов-векторов

int[] newStart= Arrays.copyOf(start, start.length + 1); 
newStart[start.length] = array[i]; 

я преобразовал его в моей C++ версии с векторами, как:

vector<int> newStart(5); //Doesnt have to be 5, sth not known 
newStart.insert(newStart.end(), start.begin(), start.end()); 
newStart[start.size()] = array[i]; 

Однако, мой код не делать то, что я требую. Это добавляет вектор один к другому, и соответственно создает новые задания. Каков правильный способ сделать это?

+1

ERM, делает это Java-код даже работать? (в любом случае: 'vector newStart (start); newStart.push_back (array [i);') –

+0

Вы говорите «последний элемент для другого массива», но я вижу только один массив, называемый 'newStart'. – tadman

+0

Вы не сказали, что ваш код делает или не делает, и я пропустил полностью неправильную инициализацию 'newStart' до заданного размера. Это эквивалентно 'resize', а не' reserve'. –

ответ

2

C++ векторы не изменяются автоматически при доступе к элементу (с помощью метода operator[] или at). Заменить последнюю строку либо

newStart.push_back(array[i]); 

или

newStart.resize(start.size() + 1); 
newStart[start.size()] = array[i]; 

(бывший быть более эффективным, поскольку он не по умолчанию инициализировать элемент первого)

Я считаю, Java массивы не auto-resize либо, так что я бы не ожидал, что Java-код тоже будет работать (но он даст исключение, в то время как код C++ заставит демонов вылететь из вашего носа или что-нибудь еще, что неприятно компилятору).


Редактировать: Снова прочитав вопрос, код на самом деле определен, но тем более неправильно.

vector<int> newStart(5); //Doesnt have to be 5, sth not known 

Этот оператор создает вектор, который содержит 5 (или любой другой) по умолчанию инициализируется элементы, которые в случае int равно 0. Таким образом, теперь вы

{0, 0, 0, 0, 0} 

Ради примера скажем start содержит {1, 2, 3, 4, 5, 6, 7}.

newStart.insert(newStart.end(), start.begin(), start.end()); 

vector::insert добавляет новые элементы расширения массива и перемещение следующих элементов по мере необходимости. Вставка перед тем end, поэтому он будет добавлять к вектору, в результате чего:

{0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7} 

Я не думаю, что это то, что вы хотели. Похоже, вам нужна копия старта. Который вы просто создали путем создания копии: vector<int> newStart(start).

newStart[start.size()] = array[i]; 

Теперь newStart имеет начальные 5 нулей и элементы из start, так что размер start.size() + 5 и, следовательно, он имеет индекс start.size(). Это элемент 5 th с конца. Таким образом, в приведенном выше примере, это будет изменять вектор к:

{0, 0, 0, 0, 0, 1, 2, 1, 4, 5, 6, 7} 
        ^

Для добавления пуска [0] до конца, использовать push_back, как указано выше.


Кроме того, помните, что Java массивы являются ссылочными типами, где присваивание только разделяет ссылку на тот же массив, но C++ векторов являются типами значений, где содержание копируется на уступки.

+0

извините, если я неправильно понял, но насколько я знаю, векторы в C++ делают auto-resize. Я использую его много, вы можете использовать резерв для создания начальной зарезервированной области памяти. – Lefsler

+0

@pwny Это именно то, что говорит этот ответ. –

+0

@ KonradRudolph Я понял, этот ответ был не очень хорошо сформулирован .. мой плохой –

0

Попробуйте это:

for (std::vector<int>::iterator it = start.begin() ; it != start.end(); ++it) { 
    newStart.push_back (*it); 
} 
+1

Это неэффективно и много ненужного кода. –

1

Я немного запутался смешением Java и C++. Надеюсь, одно из объяснений ниже поможет.

Если вы в C++, вектор имеет перегруженный operator=, так что вы можете просто ввести

newvector = oldvector;

и он будет копировать.

Если вы находитесь в Java, вы можете использовать copy constructor Ex:

Vector v2 = new Vector(v1);

0

Использование std::copy алгоритма и back_inserter итератор.

Пример кода:

#include <iterator> 
#include <vector> 
#include <algorithm> 

int main() { 
    std::vector<int> src; 
    std::vector<int> dest; 

    std::copy(src.begin(),src.end(),back_inserter(dest)); 
} 
Смежные вопросы