C++学習ノート——STLのリスト(チェーンテーブル)
18828 ワード
https://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html実際、listコンテナは双方向チェーンテーブルであり、削除要素の挿入を効率的に行うことができます.O(1)複雑度チェーンテーブルlist挿入と削除は常に定数時間であり,動的割り当てではリソースを浪費せず,listは双方向循環チェーンテーブル非連続空間ヘッダノードでデータを保存しない
#include
#include
#include
#include
// g++ -std=c++11 list.cc -o test && test.exe
using namespace std;
//
void traverse(list<int> l)
{
for (auto it = l.begin(); it != l.end(); it++) {
cout << *it << ", ";
}
cout << endl;
}
//
void reverseTraverse(list<int> l)
{
// c.rbegin() , c 。
for (auto it = l.rbegin(); it != l.rend(); it++) {
cout << *it << ", ";
}
cout << endl;
}
int main()
{
//
list<int> c0; //
list<int> c1(3); // 0
list<int> c2(5, 2); // , 2
list<int> c3(c2); // c2 copy
list<int> c4(c1.begin(), c1.end()); // c1 [_First, _Last)
// vector list
vector<int> test3(10, 2);
list<int> c5(test3.begin(), test3.end());
traverse(c5);
list<int> c6{1, 2, 3, 4, 5}; //
// : vector
// : ,
c6.insert(c6.begin(), 1000); // 1000 [1000, 1, 2, 3, 4, 5]
// , advance
auto it = c6.begin();
advance(it, 2); // 2
c6.insert(it, 1001); // [2] 1000 [1000, 1, 1001, 2, 3, 4, 5]
// :
//
list<int> c9{4, 2, 3, 4, 4};
c9.remove(4);//[2, 3] 4
// , vector
auto it1 = c6.begin();
advance(it1, 2);
c6.erase(it1); // [2] , iterator
traverse(c6); // [1000, 1, 2, 3, 4, 5]
// : vector ,vector
c6.push_back(6);
c6.push_front(7);
traverse(c6);
cout << "begin: " << *c6.begin() << endl; // iterater
cout << "end: " << *c6.end() << endl; // iterater,
cout << "front: " << c6.front() << endl; // 2
cout << "back: " << c6.back() << endl; // 4
c6.pop_back(); //
c6.pop_front(); //
// :
//
swap(c6, c5);
// , vector,
c5.sort(); //
// c5.sort(cmp);
traverse(c5);
//
list<int> c7{6, 2, 3, 1, 5};
c7.splice(c7.end(), c5); //c5 c7 , c5
traverse(c7);
// auto it2 = c7.begin();
// advance(it2, 2);
// c7.splice(it2, c5); // c5 c7 , c5
//
list<int> c8{1, 2, 3, 4, 5};
c8.reverse(); //5, 4, 3, 2, 1,
}