1. 程式人生 > >C++ STL list介紹與使用方法

C++ STL list介紹與使用方法

list(連結串列)

連結串列也即鏈式表,在資料結構中,我們知道線性表的物理儲存結構有兩種,順序表(陣列)和鏈式表(結點)。連結串列是在堆中為每一個元素分配記憶體,然後利用指標將所有元素串起來。根據這種物理儲存結構,我們很容易明白:連結串列在插入、刪除效率上比較高,但沒有辦法隨機訪問,因此訪問速度慢。
順序表在STL中的實現為vector,其優點是元素訪問速度快(元素儲存在連續的陣列中,可以直接通過索引計算元素地址),但插入、刪除效率較低。

標頭檔案:#include
建構函式
// constructors used in the same order as described above:
std::list<int> first; // empty list of ints std::list<int> second (4,100); // four ints with value 100 std::list<int> third (second.begin(),second.end()); // iterating through second std::list<int> fourth (third); // a copy of third // the iterator constructor can also be used to construct from arrays:
int myints[] = {16,2,77,29}; std::list<int> fifth (myints, myints + sizeof(myints) / sizeof(int) ); std::cout << "The contents of fifth are: "; for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++) std::cout << *it << ' '; std::cout << '\n';
迭代器

list<int>::iterator it;
list<int>::reverse_iterator rit;
it = second.begin();
it = second.end();
rit = second.rbegin();
rit = second.rend();

容器大小

cout << second.empty() << endl;
cout << second.size() << endl;
cout << second.max_size() << endl;
元素操作

second.push_back(20);
second.pop_back();
second.push_front(30);
second.pop_front();

second.insert(second.begin(), 40);
second.insert(second.begin(), 2, 200);   //插入2個200
second.insert(second.begin(), third.begin(), third.end());

second.erase(second.begin());
second.erase(second.begin(), second.end());

second.swap(third);
second.resize(10);
second.clear();

所有的插入操作都是插入到iterator指向的元素之前

其它操作
  • 由於list是鏈式儲存,因此不能隨機訪問,也即不支援索引訪問。
//連結串列拼接
std::list<int> mylist1, mylist2;
std::list<int>::iterator it;

// set some initial values:
for (int i = 1; i <= 4; ++i)
    mylist1.push_back(i);      // mylist1: 1 2 3 4

for (int i = 1; i <= 3; ++i)
    mylist2.push_back(i * 10);   // mylist2: 10 20 30

it = mylist1.begin();
it++;

//將mylist2拼接到mylist1的it指向元素前面
mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4
// mylist2 (empty)
// "it" still points to 2 (the 5th element)

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



//刪除(根據元素值刪除,而不是iterator)
mylist2.remove(20);

//去除重複元素,必須是針對已經排序過的,因為這裡只是去除連續重複的元素
mylist2.sort();
mylist2.unique();

mylist1.sort();
mylist1.merge(mylist2);   
//merge與splice一樣,合併過後,mylist2為空
//同時,合併之前必須對各個list進行排序

mylist1.reverse();  //使得mylist1各個元素逆向