簡體   English   中英

在c ++中交換兩個向量之間不同長度的序列

[英]swap sequences of different length between two vectors in c++

假設您有兩個整數向量:

在此輸入圖像描述

在此輸入圖像描述

我想定義一個函數,它允許我在兩個向量之間交換一系列元素,將兩個序列的起始索引和長度作為參數傳遞。

例如: 在此輸入圖像描述 哪里 在此輸入圖像描述 在此輸入圖像描述 是向量和作為參數傳遞的數字表示序列的起始索引和長度。

在這種情況下,我應該獲得autput

V1 = 1,2,13,14,15,5,6,7,8,9

V2 = 10,11,12,3,4-,16,17,18

我定義的一個例子的函數簽名不是約束,如果你認為有更好的方法可以

似乎所有常規STL算法都達不到您想要的精確度:

std::swap_ranges幾乎就在那里,但它要求你交換相同的長距離std::rotate也不會壞,但它要求一個范圍的終點等於第二個范圍的起點。

// pseudo-splice on vector
v1.insert(v1.begin() + 2 + 2, v2.begin() + 3, v2.begin() + 3 + 3);
v2.erase(v2.begin() + 3, v2.begin() + 3 + 3);

// pseudo-splice on vector
v2.insert(v2.begin() + 3, v1.begin() + 2, v1.begin() + 2 + 2);
v1.erase(v1.begin() + 2, v1.begin() + 2 + 2);

您當然可以輕松地將其抽象為一個函數模板,該模板為您的兩個范圍采用任意迭代器邊界。

根據David的評論進行編輯 ,您可以進行一些優化以避免不必要的大小調整

// compute smallest range here, in this case it's the v1 part
std::swap_ranges(v1.begin() + 2, v1.begin() + 2 + 2, v2.begin() + 3);

// now handle the remaining part of the longest range, in this case it's element v2 + 3 + 2
std::insert(v1.begin() + 2 + 2, v2.begin() + 3 + 2);
std::erase(v2.begin() + 3 + 2);

更新 :如果你使用std::list會更容易,因為你可以使用splice (我重新排列insert / erase部分來模仿下面的代碼)

v1.splice(v1.begin() + 2 + 2, v2, v2.begin() + 3, v2.begin() + 3 + 3);
v2.splice(v2.begin() + 3, v1, v1.begin() + 2, v1.begin() + 2 + 2);

我認為這不應該帶來任何困難,除非你必須重新分配向量,如果Length1!= Length2。

 swap_elements(v1, start1, length1, v2, start2, length2){
      if(length1 != length2){
        //alloc mem for both of the arrays
        //copy the unmodified portions of the original arrays into the new arrays
      }

      //swap the elements
 }

使用插入和擦除執行它比下面的代碼更糟糕的運行時間,因為每次調用插入和擦除時,向量的其他元素必須相應地在內存中移動,並分配新的內存塊,將向量元素移動到新的內存阻止,如有必要。 為了避免調整大小和內存問題,最好在一開始就創建兩個新的向量。

swap_elements(vector<int> &v1, int s1, int l1, vector<int> &v2, int s2, int l2){
    vector<int> nv1(v1.begin(),v1.begin()+s1);
    vector<int> nv2(v2.begin(),v2.begin()+s2);
    for(int i=0;i<l2;i++)
      nv1.push_back(v2[s2+i]);
    for(int i=0;i<l1;i++)
      nv2.push_back(v1[s1+i]);
    for(int i=s1+l1+1;i<v1.size();i++)
      nv1.push_back(v1[i]);
    for(int i=s2+l2+1;i<v2.size();i++)
      nv2.push_back(v2[i]);
    v1.clear();
    v2.clear();
    v1=nv1;
    v2=nv2;
}

暫無
暫無

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

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