在 C++ 中将向量连接到自身时出错
Error while concatenating a vector to itself in c++
我只是想将向量连接到自身,但以下代码不起作用,我找不到问题所在。如果我的输入向量是 {1,2,1},我得到的 o/p 是 {1,2,1,1,16842944,1}。请告诉我哪里错了。我想要的输出是 [1,2,1,1,2,1]
vector<int> getConcatenation(vector<int>& nums) {
int size=nums.size();
auto itr=nums.begin();
while(size--)
{
nums.push_back(*itr);
itr++;
}
return nums;
}
在您的原始程序中 push_back
使迭代器无效,使用这些无效的迭代器会导致 未定义的行为。
解决此问题的一种方法是将 std::copy_n
与 std::vector::resize
一起使用,如下所示:
vector<int> getConcatenation(vector<int>& nums) {
std::vector<int>::size_type old_Size = nums.size();
nums.resize(2 * old_Size);
std::copy_n(nums.begin(), old_Size, nums.begin() + old_Size);
return nums; //NO NEED for this return since the function took vector by reference and so the change is already reflected on passed vector
}
您还需要为 std::copy_n
添加 #include <algorithm>
。
请注意,由于您的函数采用 vector
作为参考,因此无需 return nums
,因为您对 nums
所做的更改已反映在原始向量。所以可以使用void
作为函数的return类型,然后去掉return语句。
正如已经彻底指出的那样,问题在于矢量在进行修改时重新分配其存储空间。至少有三种通用方法。
首先,使用索引代替迭代器:
vector<int> getConcatenation(vector<int>& nums) {
int size = nums.size();
for (int i = 0; i < size; ++i)
nums.push_back(nums[i]);
return nums;
}
其次,使用迭代器但确保向量不必重新分配:
vector<int> getConcatenation(vector<int>& nums) {
int size = nums.size();
nums.reserve(2 * size);
auto itr = nums.begin();
while (--size)
nums.push_back(*itr++);
return nums;
}
(并且该方法包括劳动强度较低的事情,例如使用基于迭代器进行复制的内置算法)
第三,除非你必须修改输入参数,否则只需构建一个大小合适的向量并复制到其中:
vector<int> getConcatenation(const vector<int>& nums) {
vector<int> result(2 * nums.size());
std::copy(nums.begin(), nums.end(), result.begin());
std::copy(nums.begin(), nums.end(), result.begin() + nums.size());
return result;
}
我只是想将向量连接到自身,但以下代码不起作用,我找不到问题所在。如果我的输入向量是 {1,2,1},我得到的 o/p 是 {1,2,1,1,16842944,1}。请告诉我哪里错了。我想要的输出是 [1,2,1,1,2,1]
vector<int> getConcatenation(vector<int>& nums) {
int size=nums.size();
auto itr=nums.begin();
while(size--)
{
nums.push_back(*itr);
itr++;
}
return nums;
}
在您的原始程序中 push_back
使迭代器无效,使用这些无效的迭代器会导致 未定义的行为。
解决此问题的一种方法是将 std::copy_n
与 std::vector::resize
一起使用,如下所示:
vector<int> getConcatenation(vector<int>& nums) {
std::vector<int>::size_type old_Size = nums.size();
nums.resize(2 * old_Size);
std::copy_n(nums.begin(), old_Size, nums.begin() + old_Size);
return nums; //NO NEED for this return since the function took vector by reference and so the change is already reflected on passed vector
}
您还需要为 std::copy_n
添加 #include <algorithm>
。
请注意,由于您的函数采用 vector
作为参考,因此无需 return nums
,因为您对 nums
所做的更改已反映在原始向量。所以可以使用void
作为函数的return类型,然后去掉return语句。
正如已经彻底指出的那样,问题在于矢量在进行修改时重新分配其存储空间。至少有三种通用方法。
首先,使用索引代替迭代器:
vector<int> getConcatenation(vector<int>& nums) {
int size = nums.size();
for (int i = 0; i < size; ++i)
nums.push_back(nums[i]);
return nums;
}
其次,使用迭代器但确保向量不必重新分配:
vector<int> getConcatenation(vector<int>& nums) {
int size = nums.size();
nums.reserve(2 * size);
auto itr = nums.begin();
while (--size)
nums.push_back(*itr++);
return nums;
}
(并且该方法包括劳动强度较低的事情,例如使用基于迭代器进行复制的内置算法)
第三,除非你必须修改输入参数,否则只需构建一个大小合适的向量并复制到其中:
vector<int> getConcatenation(const vector<int>& nums) {
vector<int> result(2 * nums.size());
std::copy(nums.begin(), nums.end(), result.begin());
std::copy(nums.begin(), nums.end(), result.begin() + nums.size());
return result;
}