我正在尝试将数组复制到矢量。
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 ....
答案 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
足够通用,可以重复用于任何类型的容器。