我只是想將一個向量連接到自身,但以下代碼不起作用,我無法找到問題。如果我的輸入向量是 {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;
}
uj5u.com熱心網友回復:
在您的原始程式中push_back,迭代器無效,使用這些無效的迭代器會導致未定義的行為。
解決此問題的一種方法是使用std::copy_nwith 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
}
您還需要添加#include <algorithm>for std::copy_n。
請注意,由于您的函式采用vectorbe 參考,因此無需回傳,nums因為您所做的更改nums已經反映在原始向量上。所以你可以使用void作為函式的回傳型別,然后洗掉 return 陳述句。
uj5u.com熱心網友回復:
正如已經徹底指出的那樣,問題在于向量在進行修改時會重新分配其存盤。對此,至少有三種通用方法。
首先,使用索引而不是迭代器:
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.resize(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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371696.html
