您的位置:首页 > 编程语言 > C语言/C++

C++语法基础--list容器提供的的特有操作--merge(),remove(),reverse(),unique(),sort(),splice()

2013-07-14 09:58 681 查看
泛型算法merge(),remove,reverse,unique,虽然可以用在List上,但却付出了性能上的代价(list容器不支持随机访问),而list容器提供的这些算法可以更高效低执行。



list容器的特有操作






*merge

原型:

void merge (list& x);



template <class Compare>

void merge (list& x, Compare comp);

Tips:调用merge()前必须先排序,否则出错



Example:

int main ()

{

list<int> first, second;

first.push_back (3);

first.push_back (2);

first.push_back (5);

second.push_back (4);

second.push_back (7);

second.push_back (1);

//必须先排序,否则出错

first.sort();

second.sort();


first.merge(second);

// ( now, second is empty)

second.push_back (6);

first.merge(second,[](int a,int b)->bool{return a<b;});//"first contains:

for(int x:first)

{

cout<<x<<'\t'; //1 2 3 4 5 6 7

}



return 0;

}

*remove()

原型:

void remove (const value_type& val);



Example:

int main ()

{

int myints[]= {1,2,3,4};

list<int> mylist (myints,myints+4);

mylist.remove(2);

//mylist contains:

for(int x:mylist)

{

cout<<x<<'\t';//1 3 4

}

return 0;

}

*remove_if

原型:

template <class Predicate>

void remove_if (Predicate pred)



Example:

int main ()

{

int myints[]= {1,2,3,4,5};

list<int> mylist (myints,myints+5);

mylist.remove_if ([](int x)->bool{return x%2==0;});

//mylist contains:

for(int x: mylist)

{

cout<<x<<'\t'; //1 3 5

}

return 0;

}



*reverse

原型:


void reverse();

Example:



int main ()

{

list<int> mylist;

for (int i=1; i<=5; ++i) mylist.push_back(i); mylist.reverse(); for(int x: mylist)

{

cout<<x<<'\t';//5 4 3 2 1

}

return 0;

}

*sort

原型:

void sort();

template <class Compare>

void sort (Compare comp);

Example:

//重载输出操作符

ostream& operator<<(ostream& ostr, const list<int>& list)

{


for (auto &i : list)

{

ostr << " " << i;

}

return ostr;

}



int main()

{

int arr[]= { 5,0,1,3,2,6,4 };

list<int> list(arr,arr+7);

list.sort();



//ascending:

cout << list << "\n"; //0 1 2 3 4 5 6

list.sort([](int a,int b)->bool{return a>b;});



//descending:

cout<< list << "\n"; //6 5 4 3 2 1 0

}

*splice

原型:

entire list:

void splice (iterator position, list& x);

single element :

void splice (iterator position, list& x, iterator i);

element range :

void splice (iterator position, list& x, iterator first, iterator last);

Example:

int main ()

{

list<int> mylist1, mylist2;

list<int>::iterator it;

// set some initial values:

for (int i=1; i<=3; ++i)

mylist1.push_back(i);
// mylist1: 1 2 3

for (int i=4; i<=5; ++i)

mylist2.push_back(i); // mylist2: 4 5

it = mylist1.begin();

++it; // points to 2

//entire list

mylist1.splice (it, mylist2);
// mylist1: 1 4 5 2 3

// mylist2 (empty)

// "it" still points to 2

//single element

mylist2.splice (mylist2.begin(),mylist1, it);

// mylist1: 1 4 5 3

// mylist2: 2

// "it" is now invalid.

it = mylist1.begin();

advance(it,2); // "it" points now to 5

// element range :

mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end()); //
mylist1: 5 3 1 4




return 0;

}

*unique

list的unique与泛型算法unique的区别:list的unique将list中第二个和后续重复的元素删除出该容器

原型:

void unique();

template <class BinaryPredicate>

void unique (BinaryPredicate binary_pred);

Example:

int main()

{

int arr[]= {1, 2,1,3,2,1,2};

list<int> lst(arr,arr+7);



lst.sort();

lst.unique();
//version one



//contents after unique()

for (int x : lst)

{

cout << ' ' << x;//1 2 3

}

cout<<endl; lst.push_back(4);

lst.push_back(2);



lst.sort();

lst.unique([](int a,int b)->bool{return a==b;});//version two

for (int x : lst)

{

cout << ' ' << x;//1 2 3 4

}

return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐