复制阵列矢量

Copy arrays-vectors

本文关键字:阵列 复制      更新时间:2023-10-16

这可能太基本了,但我想问一下。我的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];

但是,我的代码不能满足我的要求。这会将矢量一个添加到另一端,并相应地进行新的赋值。正确的方法是什么?

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

CCD_ 8添加了扩展阵列的新元素,并根据需要移动以下元素。插入位于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,因此它确实有索引start.size()。它是从末尾开始的第5个元素。因此,根据上面的例子,这将把矢量修改为:

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

要将start[0]附加到末尾,请按照上面的说明使用push_back


还要记住,Java数组是引用类型,其中赋值只是共享对同一数组的引用,但C++向量是在赋值时复制内容的值类型。

Java和C++的混合让我有点困惑。希望下面的解释能有所帮助。

如果您在C++中,vector有一个重载运算符=,所以您可以只键入

newvector = oldvector;

它会复制。

如果你在java中,你可以使用复制构造函数ex:

Vector v2 = new Vector(v1);

试试这个:

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

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