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++的載體是其中內容被上分配複製的值的類型。
呃,這是否Java代碼甚至工作? (無論如何:'vector newStart(start); newStart.push_back(array [i);') –
你說「最新元素到另一個數組」,但我在這裏只看到一個名爲'newStart'的數組。 – tadman
你沒有說你的代碼做了什麼或不做什麼,我錯過了newStart完全錯誤的初始化給定的大小。這相當於'resize',而不是'reserve'。 –