/* stllist.cpp
list是一个双向列表容器,完成了标准C++数据结构中链表的所有功能;
list与vector和deque类似,只不过其中的对象提供了对元素的随机访问。
STL以双向链表的方式实现list,访问需要从链表的某个端点开始;
list对象插入和删除一个元素所需时间与该元素在链表中的位置无关。
list不提供随机存取(No!),其优势是任何位置插入和删除都非常迅速;
在list中移动一段元素比在vector和deque中要快得多,在需要时可改变自身大小。
*/
#include <iostream>
#include <list>
#include <string>
using namespace std;
typedef list<string> LISTSTRING;
typedef list<string>::iterator LISTSTRING_ITER;
typedef list<int>::iterator LISTINT_ITER;
template<class T>
class is_odd
{
public:
bool operator()(T &val)
{
;
}
};
int main(void)
{
//list赋值
//push_front();
//push_back();
//pop_front();
//pop_back();
list<int> myList;
myList.push_back();
myList.push_front();
//list大小度量函数
list<int> c1;
list<int>::size_type i;
c1.push_back();
i = c1.size();
cout << "The c1 size is " << i << endl;
c1.push_back();
i = c1.size();
cout << "The c1 size is " << i << endl;
c1.push_back();
c1.push_back();
c1.resize();
i = c1.size();
cout << "The c1 size is " << i << endl;
i = c1.max_size();
cout << "The c1 max size is " << i << endl;
//list返回函数
//begin front rbegin 下同
//end back rend
int nTmpFront = myList.front();
int nTmpBack = myList.back();
cout << nTmpFront << endl;
cout << nTmpBack << endl;
//...
//判断是否为空
if (myList.empty())
{
cout << "list is empty!" << endl;
}
//list元素访问
//无at 也无operator[]
LISTSTRING strList;
strList.push_back("AA");
strList.push_back("BB");
strList.push_back("CC");
strList.push_back("DD");
LISTSTRING_ITER pListIter;
for (pListIter = strList.begin(); pListIter != strList.end(); pListIter++)
{
cout << *pListIter << endl;
}
//list重置技术
LISTSTRING strList1;
strList1.push_back("AAaa");
strList1.push_back("BBbb");
strList1.push_back("CCcc");
strList1.push_back("DDdd");
strList.assign(strList1.begin(), strList1.end());
for (pListIter = strList.begin(); pListIter != strList.end(); pListIter++)
{
cout << *pListIter << endl;
}
//list容器内容交换
LISTSTRING strListPre;
strListPre.push_back("AA");
strListPre.push_back("BB");
strListPre.push_back("CC");
strListPre.push_back("DD");
cout << "strListPre :" << endl;
for (pListIter = strListPre.begin(); pListIter != strListPre.end(); pListIter++)
{
cout << *pListIter << endl;
}
LISTSTRING strListPost;
strListPost.push_back("aa");
strListPost.push_back("bb");
strListPost.push_back("cc");
strListPost.push_back("dd");
cout << "strListPost :" << endl;
for (pListIter = strListPost.begin(); pListIter != strListPost.end(); pListIter++)
{
cout << *pListIter << endl;
}
strListPre.swap(strListPost);
cout << "strListPre :" << endl;
for (pListIter = strListPre.begin(); pListIter != strListPre.end(); pListIter++)
{
cout << *pListIter << endl;
}
cout << "strListPost :" << endl;
for (pListIter = strListPost.begin(); pListIter != strListPost.end(); pListIter++)
{
cout << *pListIter << endl;
}
//list插入和删除技术
LISTSTRING listString;
listString.push_back("Michael Jordan");
listString.push_back("Kobe Bryant");
listString.push_back("Lebron James");
listString.push_back("James Harden");
for (pListIter = listString.begin(); pListIter != listString.end(); pListIter++)
{
cout << *pListIter << endl;
}
pListIter = listString.begin();
listString.insert(pListIter, "Jerry West");
pListIter++;
pListIter++;
listString.insert(pListIter, "Tim Duncan");
pListIter = listString.end();
listString.insert(pListIter, "Stephen Curry");
for (pListIter = listString.begin(); pListIter != listString.end(); pListIter++)
{
cout << *pListIter << endl;
}
//erase操作
pListIter = listString.begin();
listString.erase(pListIter);
cout << "after erase :" << endl;
for (pListIter = listString.begin(); pListIter != listString.end(); pListIter++)
{
cout << *pListIter << endl;
}
//clear操作
//erase(list::begin(), list::end())
list<int> listInt;
listInt.push_back();
listInt.push_back();
listInt.push_back();
cout << "size of listInt is " << listInt.size() << endl;
listInt.clear();
cout << "size of listInt is " << listInt.size() << endl;
//list模板类函数
// == > >= < <=等等 操作省略
//list特殊函数
//与vector和deque相比,除了具有以上相同的函数外,还具有一些特殊函数
//merge remove remove_if sort splice
list<int> listMerge;
listMerge.push_back();
listMerge.push_back();
list<int> listMerge1;
listMerge1.push_back();
listMerge1.push_back();
listMerge.merge(listMerge1);
listMerge.sort();
for (LISTINT_ITER pListIntIter = listMerge.begin(); pListIntIter != listMerge.end(); pListIntIter++)
{
cout << *pListIntIter << endl;
}
listInt.push_back();
listInt.push_back();
listInt.push_back();
listInt.remove();
for (LISTINT_ITER pListIntIter = listInt.begin();
pListIntIter != listInt.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
list<int> cl1;
LISTINT_ITER pInt1, pInt2;
cl1.push_back();
cl1.push_back();
cl1.push_back();
cl1.push_back();
cl1.push_back();
cl1.push_back();
for (LISTINT_ITER pListIntIter = cl1.begin();
pListIntIter != cl1.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
list<int> cl2 = cl1;
cl2.remove_if(is_odd<int>());
for (LISTINT_ITER pListIntIter = cl2.begin();
pListIntIter != cl2.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
//比merge更好用的splice
cl1.splice(cl1.end(), cl2);
for (LISTINT_ITER pListIntIter = cl1.begin();
pListIntIter != cl1.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
//保证任意连个连续存储值不同
list<int> listUnique;
listUnique.push_back();
listUnique.push_back();
listUnique.push_back();
listUnique.push_back();
listUnique.push_back();
list<int> listUniqueTmp = listUnique;
for (LISTINT_ITER pListIntIter = listUnique.begin();
pListIntIter != listUnique.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
//任意两个具有相同值的连续对象的后者删除
listUnique.unique();
for (LISTINT_ITER pListIntIter = listUnique.begin();
pListIntIter != listUnique.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
//把和第一个元素不同的值删除
not_equal_to<int> mypred;
listUniqueTmp.unique(mypred);
for (LISTINT_ITER pListIntIter = listUniqueTmp.begin();
pListIntIter != listUniqueTmp.end();
pListIntIter++)
{
cout << *pListIntIter << endl;
}
cout << endl;
cin.get();
;
}