1

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

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] for x=0,1,2,3....

4

6 回答 6

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

还值得注意的是,“插入”可能不是您想要的。如果您的目标是将向量视为数组并覆盖向量的 1000 元素长部分,那么您应该使用 std::copy 代替。插入将进一步调整数组的大小,因此如果调整大小将使向量长度为​​ 1005 个元素,并且您从位置 5 开始插入它们,那么最终向量的长度将是 2005 个元素,其中 A 的内容从 5 到 1004。

您可以改为使用以下代码替换该insert行:

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

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

于 2012-09-28T07:07:52.200 回答
2

将数组复制到向量的更好方法:

vec.resize(1000+some_position);//if needed
std::copy(A,A+1000,vec.begin()+some_position);
于 2012-09-28T07:05:07.240 回答
1

Your use of sizeof is wrong. sizeof is a very primitive operator, which returns the number of bytes in the shallow image of the object or type. This is totally useless except for very low level programming. If you need to deal with C style arrays, there functions std::begin() and std::end() in C++11; in earlier versions of C++, we just wrote them ourselves. (I usually also wrote a size() function, which basically returned the number of elements.) And std::vector works in number of elements, not number of bytes. So your last two lines of code should be:

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

At least, that's what I think you're trying to do, based on the comments: create an std::vector<int> with x elements initialized to 0, followed by the contents of A.

于 2012-09-28T07:44:46.237 回答
1

您似乎认为 sizeof() 给出了元素的数量

例如

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

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

正确的调整大小应该是

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

紧随其后的是

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

尽管我同意 Sergey 的观点,即 copy() 是更好(更优雅)的方法。

于 2012-09-28T07:07:45.047 回答
1

替换sizeof(A)sizeof(A) / sizeof(A[0]),它将起作用。

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

于 2012-09-28T07:11:18.747 回答
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的通用性足以重复用于任何类型的容器。

于 2012-09-28T09:11:58.783 回答