0

这可能太基本了,但我想问一下。我的 Java 代码将数组复制startnewStart另一个数组并将最后一个元素分配给另一个数组。

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];

但是,我的代码没有满足我的要求。这会将向量一个添加到另一端,并相应地进行新的分配。这样做的正确方法是什么?

4

4 回答 4

2

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}

例如,假设startcontains {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++ 向量是值类型,其中内容在赋值时被复制。

于 2013-07-03T15:10:23.393 回答
1

我对 Java 和 C++ 的混合感到有些困惑。希望下面的解释之一会有所帮助。

如果你在 C++ 中,vector 有一个重载的operator=所以你可以输入

newvector = oldvector;

它会复制。

如果您使用的是 java,则可以使用复制构造函数ex:

Vector v2 = new Vector(v1);

于 2013-07-03T15:26:19.883 回答
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));
}
于 2013-07-04T06:08:09.290 回答
0

尝试这个:

for (std::vector<int>::iterator it = start.begin() ; it != start.end(); ++it) {
     newStart.push_back (*it);
}
于 2013-07-03T15:25:05.000 回答