簡體   English   中英

在 c++ 中將向量連接到自身時出錯

[英]Error while concatenating a vector to itself in c++

我只是想將一個向量連接到自身,但以下代碼不起作用,我無法找到問題所在。 如果我的輸入向量是 {1,2,1},我得到的 o/p 是 {1,2,1,1,16842944,1}。 請告訴我哪里錯了。 我想要的 output 是 [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_nstd::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>

請注意,由於您的 function 將vector作為參考,因此無需返回nums ,因為您對nums所做的更改已經反映在原始向量上。 所以可以使用void作為 function 的返回類型,然后去掉 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.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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM