将数组复制到不按预期发生的向量中

时间:2012-09-28 06:58:18

标签: c++ vector

我正在尝试将数组复制到矢量。

int A[1000]; //This array is filled by some function
vector<int> vec;

//some position from which I want to write the contents of the array into vector
int x = some_position;

vec.resize(sizeof(A)+x);
vec.insert(vec.begin()+x, A, A+sizeof(A));

问题是每个第四个元素都没有正确复制。其余元素被正确复制。即vec [x + 3]!= A [x + 3]  对于x = 0,1,2,3 ....

6 个答案:

答案 0 :(得分:4)

首先,您需要检查您对sizeof的理解。它返回A整体所需的字节数,而不是A中的项目数,因为您需要sizeof(A)/sizeof(*A)

int A[1000];
vector<int> vec;

int x = 5;

vec.resize(x + sizeof(A) / sizeof(*A));
vec.insert(vec.begin()+x, A, A + sizeof(A) / sizeof(*A));

值得注意的是,'insert'可能不是你想要的。如果您的目标是将矢量视为数组并覆盖向量的1000个元素长部分,那么您应该使用std :: copy。 Insert会更多地调整数组的大小,所以如果调整大小会使向量1005元素变长,并且它们开始插入位置5,那么最终向量将是2005元素长,A的内容从5到1004。

您可以将insert行替换为:

std::copy(A, A + sizeof(A) / sizeof(*A), vec.begin() + x);

这将覆盖从位置5开始的向量内容,并将向量大小保持为1005。

答案 1 :(得分:2)

将数组复制到vector的更好方法是:

vec.resize(1000+some_position);//if needed
std::copy(A,A+1000,vec.begin()+some_position);

答案 2 :(得分:1)

您似乎相信sizeof()会给出元素数量

e.g。

vec.resize(sizeof(A)+x);

但事实并非如此。它给出了字节数。

正确的大小调整应该是

vec.resize(sizeof(A)/sizeof(int)+x);

之后

vec.insert(vec.begin()+x, A, A+sizeof(A)/sizeof(int));

虽然我同意谢尔盖认为copy()是更好(更优雅)的方式。

答案 3 :(得分:1)

sizeof(A)替换为sizeof(A) / sizeof(A[0]),它将有效。

正如@Sergey所指出的那样,vec.resize();在这种情况下不必要insert()也会调整vector的大小。

答案 4 :(得分:1)

您使用sizeof是错误的。 sizeof是一个非常原始的运算符, 它返回对象的浅图像中 bytes 的数量 或者输入。除了非常低级别的编程之外,这完全没用。 如果您需要处理C样式数组,那么函数std::begin() 和C ++ 11中的std::end();在早期版本的C ++中,我们只写了 他们自己。 (我通常还写了一个size()函数 基本上返回了元素的数量。)并且std::vector适用于 元素数,而不是字节数。所以你的最后两行代码 应该是:

vec.resize( x );
vec.insert( vec.end(), std::begin( A ), std::end( A ) );

至少,这就是我认为你正在尝试做的事情,基于 评论:创建一个std::vector<int>,其中x个元素已初始化为 0,然后是A的内容。

答案 5 :(得分:0)

将数组复制到矢量。使用C ++完全避免这种情况。而不是

void fill_array(int*, size_t);
int A[1000];
fill_array(A,1000);
std::vector<int> vec;
my_copy(vec,A);

简单地做

std::vector<int> vec;
vec.resize(1000);    // or whatever
fill_array(vec.data(),vec.size());  // std::vector::data() is C++11

在C ++(也是C ++之前的版本11)中,您实际上会更喜欢这样做:

template<typename iterator> fill_data(iterator begin, iterator end);
std::vector<int> vec;
vec.resize(n);    // make space (otherwise fill_data cannot fill in anything)
fill_data(vec.begin(), vec.end());

然后你的fill_data足够通用,可以重复用于任何类型的容器。