C++--List
一,引言
list作为C++STL库中非常常见的容器。熟练的掌握list各个函数接口的使用方法和使用逻辑显得十分重要,因此下文将介绍list的主要的用法,注意事项以及测试用例。
二,构造函数
list初始化分为默认构造,n个数据的构造,迭代器构造,拷贝构造。赋值函数内部调用的也是拷贝构造。具体实例如下:
list<int> s;
list<int> s1(10, 2);
list<int> s2(s1.begin(), s1.end());
list<int> s3;
s3 = s1;
运行结果如下:
三,迭代器
常用的迭代器有四种,begin指向开始位置的迭代器;end指向最后数据下一个位置的迭代器;rbegin指向最后一个元素位置的反向迭代器。rend指向最后一个元素下一个位置的反向迭代器。
具体例子如下:
list<int> s{ 1,2,3,4,5,6,7,8 };
cout << *s.begin()<<endl;
cout << *s.rbegin() << endl;
测试结果:
end以及rend迭代器指向的没有数据。这里不进行测试。
四,capacity
分别计算list容器是否为空,以及 list容器的数据个数。
具体例子如下:
st<int> s{ 1,2,3,4,5,6,7,8 };cout << s.empty()<<endl;cout << s.size() << endl;
empty容器不为空返回0,为空返回1。
测试结果:
五,元素数据获取
list容器的底层是双向循环链表。不支持数据的随机访问。front返回第一个数据的引用;back返回最后一个数据的引用。
测试用例如下:
list<int> s{ 1,2,3,4,5,6,7,8 };
cout << s.front()<<endl;
cout << s.back() << endl;
s.front() = 10;
s.back() = 20;
for (auto c : s)
{cout << c << ' ';
}
测试结果如下:
返回的引用是可以修改该位置的数值的。
六,修饰符函数
1,assign
assign函数将指定容器赋值给list对象。第一种是迭代器区间;第二种是n个val数据。具体例子如下:
list<int> s{ 2,3,4,5,6,7,8 };
list<int> s1(5,1);
list<int> s2;
s1.assign(s.begin(), s.end());
s2.assign(s.begin(), s.end());
for (auto ch : s1)
{cout << ch<<' ';
}
cout << endl;for (auto ch : s2)
{cout << ch << ' ';
}
cout << endl;
原list容器的数据会被assign函数指定的数据替代。
测试结果如下:
2,push_front;pop_front;push_back;pop_back
头插,头删;尾插,尾删。
具体示例如下:
list<int> s;
s.push_back(10);
s.push_back(9);
s.push_back(8);
s.push_back(7);
printfs(s);
s.push_front(100);
s.push_front(200);
printfs(s);
s.pop_back();
printfs(s);
s.pop_front();
printfs(s);
测试结果如下:
printfs函数是打印list容器数据函数。
3,erase
删除指定位置或指定区域的数据。传入迭代器位置或者区间。返回删除下一个位置的迭代器。由于list容器的物理地址并不连续。并不会造成迭代器的失效。具体用例如下:
list<int> s{ 1,2,3,4,5,6,7,8,9 };
auto it = s.begin();
it++;
it = s.erase(it);
printfs(s);
s.erase(it,s.end());
printfs(s);
测试结果如下:
需要注意的是经过erase之后需要用迭代器变量进行接收。否则原本位置的迭代器就会失效。
4,rsize
调整容器的大小,若容器小于该函数参数,则会对容器进行缩容。若该函数参数大于list容器则会进行扩容,扩容部分填充val值。
具体例子如下:
list<int> s{ 1,2,3,4,5,6,78,0 };
s.resize(5);
printfs(s);
s.resize(10, 5);
printfs(s);
测试结果如下:
5,clear
清除list容器,使得list容器为空。
七,operation
1,splice
1,将x插入到原list的指定位置,并对x进行删除。
2,将x的指定位置的数据插入到list的指定位置,并删除x中这个数据。
3,将x的指定区间的数据插入到list的指定位置,并删除x的区间的数据。
具体例子如下:
list<int> s{ 1,2,3,4,5 };
list<int> s1{ 11,12,13,14 };
list<int> s2{ 100,111,222,444 };
s.splice(s.begin(),s2);
printfs(s);
s.splice(s.begin(), s1, s1.begin());
printfs(s);
s.splice(s.begin(), s1, s1.begin(),s1.end());
printfs(s);
测试结果如下:
2.unique
删除有效容器中多余的多个相同数据,只留下一组。