list容器內建splice這個函數,可以將容器依指定範圍切割,
以及std的partition可以對容器中的元素進行條件篩選並排續,
稱著記憶猶新趕快記錄下來用法。
#include <list>
#include <iostream>
#include <algorithm>
#include <random>
#include <string>
using namespace std;
class data
{
public:
data(int n):m_data(n){};
virtual ~data(){};
int m_data;
}//宣告要儲存的資料類;
int main(int argc,char **argv)
{
//隨機引擎
std::random_device RD;
auto seed=RD();
std::mt19937 EN;
std::uniform_int_distribution<int> di(1,100);
list<data> DataList;
//初始化每個元素
for(int i=1;i!=11;i++)
{
data a(di(EN));
DataList.push_back(a);
}
//創建一個空白的list
std::list<data> empty;
//使用splice來將原有在datalist中的元素轉移過去
//splice使用方式
//list.splice(參數1,參數2,參數3,參數4);
//參數一:位置
//在新容器中x的元素插入的位置(迭代器)。
//
//參數二:相同類型的列表對象(如本例當有相同元素data的list)(容器)。
//
//參數三、參數四:
//原容器中被剪接下來的範圍(迭代器)
empty.splice(empty.begin(),
DataList,
DataList.begin(),
DataList.end());//將原有容器所有元素移到新容器,Datalist變為空
//利用lambda函數來將新容器的值打印
for_each(empty.begin(),empty.end(),
[](const data d){
cout<<d.m_data<<endl;
}
);
cout<< "par is"<<partition_val.m_data<<endl<<endl;
//使用partition函數進行排列
std::partition(empty.begin(),empty.end(),
[&](data const& d){
return d.m_data%2==1;//假如元素是基數則往前排列
}
);
cout<<string(50,'=')<<endl;
//打印經過partition函數之後的值
for(auto a:empty)
{
cout<<a.m_data<<endl;
}
return 0;
}