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;
}
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;
}
相关文章推荐
- C++语法基础--泛型算法(generic algorithm)--对容器排序的算法sort(),stable_sort(),unique()
- C++语法基础--顺序容器(三)--关系操作符,容器大小的操作,访问元素,删除元素,查找元素
- C++语法基础--顺序容器(二)--容器常用操作,迭代器失效总结
- C++语法基础--顺序容器(一)--vector,list,deque
- C++ 中list容器,stl中sort自定义排序规则 注意事项
- C++学习笔记26——泛型算法之容器元素排序(sort unique)
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- 链表list容器中通过splice合并链表与merge的不同,及需要注意的问题
- 用vector、 multimap、 list容器实现好友列表的各种操作 C++
- C++ list容器基础使用
- C++ 中list容器,自定义sort排序规则,stl中sort自定义排序规则
- C++语法基础--关联容器--multimap,multiset
- C++语法基础--泛型算法(generic algorithm)--replace_copy(),unique_copy,copy()
- C++语法基础--泛型算法(generic algorithm)--反向迭代器,reverse_iterator::base()
- java基础入门-----list容器的基本操作1
- C++基础的不能再基础的学习笔记——顺序容器(其他操作)
- 关于c++ list容器的操作摸索
- C++ 中list容器,自定义sort排序规则,stl中sort自定义排序规则
- Python基础——append、count、extend、index、insert、pop、remove、reverse、sort、clear、copy
- 链表list容器中通过splice合并链表与merge的不同,及需要注意的问题