C++ 向量不会在元素访问时自动调整大小(通过operator[]
norat
方法)。将最后一行替换为
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
contains {1, 2, 3, 4, 5, 6, 7}
。
newStart.insert(newStart.end(), start.begin(), start.end());
vector::insert
添加扩展数组的新元素并根据需要移动以下元素。插入是 before end
,所以它会附加到向量中,结果是:
{0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}
我不认为这是你想要的。看起来你想要一份 start 的副本。您只需通过复制构造来创建:vector<int> newStart(start)
.
newStart[start.size()] = array[i];
现在newStart
有最初的 5 个零和来自 的元素start
,所以它的大小是start.size() + 5
,因此它确实有 index start.size()
。它是从末尾算起的第 5个元素。因此,根据上面的示例,这会将向量修改为:
{0, 0, 0, 0, 0, 1, 2, 1, 4, 5, 6, 7}
^
要将 start[0] 附加到末尾,请push_back
按上述使用。
还要记住,Java 数组是引用类型,其中赋值只是共享对同一数组的引用,但 C++ 向量是值类型,其中内容在赋值时被复制。