2013-07-03 59 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

呃,這是否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數組不自動調整大小,所以我不希望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()。它是從末端開始的元素。因此每個上述例子中,這將修改向量:

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

要追加起動[0]到最後,使用push_back按照上述。


另外請記住,Java數組是引用類型,其中分配只是共享參考相同的數組,但C++的載體是其中內容被上分配複製的值的類型。

+0

對不起,如果我誤解了,但據我所知在C++中的向量會自動調整大小。我使用它很多,你可以使用reserve來創建一個初始的保留內存區域。 – 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的混合有點困惑++。希望下面的一個explinations會有幫助。

如果您在C++的時候,矢量已經超載operator=,所以你可以只輸入

newvector = oldvector;

,它會複製。

如果您在Java的時候,你可以使用copy constructor例如:

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)); 
}