这可能太基本了,但我想问一下。我的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];
但是,我的代码不能满足我的要求。这会将向量一个添加到另一个结尾,并相应地进行新的分配。这样做的正确方法是什么?
答案 0 :(得分: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}
我认为这不是你想要的。看起来你想要一份start。您只需通过复制构建创建:vector<int> newStart(start)
。
newStart[start.size()] = array[i];
现在newStart
最初有5个零和来自start
的元素,所以它的大小为start.size() + 5
,因此它的索引为start.size()
。它是来自end的5 th 元素。因此,根据上面的示例,这会将向量修改为:
{0, 0, 0, 0, 0, 1, 2, 1, 4, 5, 6, 7}
^
要将开始[0]追加到最后,请按照上面的说明使用push_back
。
还要记住,Java数组是引用类型,其中赋值只是共享对同一数组的引用,但C ++向量是在赋值时复制内容的值类型。
答案 1 :(得分:1)
我对Java和C ++的混合感到有些困惑。希望下面的一个说明将有所帮助。
如果你使用的是C ++,那么vector会有一个过载的operator=,所以你只需输入
newvector = oldvector;
它会复制。
如果您使用的是java,则可以使用copy constructor ex:
Vector v2 = new Vector(v1);
答案 2 :(得分:0)
试试这个:
for (std::vector<int>::iterator it = start.begin() ; it != start.end(); ++it) {
newStart.push_back (*it);
}
答案 3 :(得分: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));
}