簡體   English   中英

矢量分割/移位元素

[英]Vector split/shift elements

我有std::vector<type> myVector

可以說內容是:

el1, el2, el3, splitElement, el4,el5

我將splitElement拆分為split1split2我想要向量:

split2, el4, el5, el1, el2, el3, split1

Split2 應該開始,split1 結束。 其他元素的順序應該像示例中那樣。 讓我們將向量視為鏈。 我想插入兩個元素和移位鏈以使 split2 第一個元素。 使用 stl 的優雅而有效的方法是什么?

我現在的快速代碼(這是非常丑陋的解決方案):

std::vector<type> before;
std::vector<type> after;
bool afterBool = false;
for(std::vector<type>::iterator it = myVector.begin(); it != myVector.end(); it++)
{
     if(*it == splitElement)
     {
          afterBool = true;
          before.push_back(split1);
          after.push_back(split2);
     }
     else if(afterBool)
          after.push_back(*it);
     else
          before.push_back(*it);
}
myVector.clear();
for(std::vector<type>::iterator it = after.begin(); it != after.end(); it++)
     myVector.push_back(*it);
for(std::vector<type>::iterator it = before.begin(); it != before.end(); it++)
     myVector.push_back(*it);

我添加它只是因為我不想在沒有任何代碼的情況下離開主題。

如何以漂亮的方式做到這一點?

例子:

std::vector<int> myvector = {1, 2, 3, 0, 4, 5};
int splitElement = 0;
int split1 = -1;
int split2 = -2;

首先你找到你的splitElement

auto it = std::find(myvector.begin(), myvector.end(), splitElement);

然后使用std::rotate算法在找到splitElement的點旋轉向量:

std::rotate(myvector.begin(), it, myvector.end());
// this yields { 0, 4, 5, 1, 2, 3 }

最后只需將 split2 分配給開始並將 split1 推到后面:

myvector[0] = split2;
myvector.push_back(split1);

向量現在看起來像這樣: {-2, 4, 5, 1, 2, 3, -1}

聽起來您想對向量進行分區。 所以你可以使用std::partition
以整數和 -1 作為拆分元素為例。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct Splitter
{
    int split;
    Splitter(int sp):split(sp){}
    bool operator()(int i)
    {
    return split < i;
    }
};
int main () {
  vector<int> myvector;
  vector<int>::iterator it, bound;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  bound = partition (myvector.begin(), myvector.end(), Splitter(5));

  myvector.insert(bound, -1);
  cout << "odd members:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;
  cout << endl;

  return 0;
}

由於您還沒有提到類型的排序要求和 < 操作。 我猜你只是想拆分元素並將第一個拆分作為向量中的最后一個元素,將第二個拆分作為向量的第一個元素我想更好的方法是使用數據結構(鏈表)

  • 將向量的元素存儲在 LL 中
  • 遍歷列表直到分裂元素
  • 將第二個元素作為頭部,第一個元素作為 LL 的尾部
  • 原始尾巴應該指向它旁邊的原始 tal。

在完成上述這些操作之后。只需遍歷 ll 並存儲回向量中。

暫無
暫無

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

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