目录
list(size_type, const value_type& val = value_type())
list(InputIterator first, InputIterator last)
list的介绍
我们再来回顾一下双向链表的结构:
之前我写过这样的博客哦~
双向链表的实现_暴走的橙子~的博客-CSDN博客_双向链表实现
list的使用
constructor
list()
举个栗子:
int main()
{
list<int> l;
return 0;
}
我们调试一下来看:
list(size_type, const value_type& val = value_type())
举个栗子:
int main()
{
list<int> l(5, 10);
return 0;
}
我们调试一下来看:
list(InputIterator first, InputIterator last)
举个栗子:
int main()
{
list<int> l1(5, 10);
list<int> l2(l1.begin(), l1.end());
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
list(const list& x)
举个栗子:
int main()
{
list<int> l1(5, 10);
list<int> l2(l1);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
iterator
begin/cbegin
end/cend
rbegin/crbegin
rend/crend
针对上面的迭代器使用举个栗子:
int main()
{
list<int> l = { 1,2,3,4,5 };//C++11的语法
//正向迭代器
list<int>::iterator it1 = l.begin();
while (it1 != l.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
//反向迭代器
list<int>::reverse_iterator it2 = l.rbegin();
while (it2 != l.rend())
{
cout << *it2 << " ";
it2++;
}
cout << endl;
return 0;
}
运行结果:
list capacity
empty
举个栗子:
int main()
{
list<int> l1;
cout << "l1.empty():" << l1.empty() << endl;
list<int> l2(5, 10);
cout << "l2.empty():" << l2.empty() << endl;
return 0;
}
运行结果:
size
举个栗子:
int main()
{
list<int> l1;
cout << "l1.size():" << l1.size() << endl;
list<int> l2(5, 10);
cout << "l2.size():" << l2.size() << endl;
return 0;
}
运行结果:
list element access
front
举个栗子:
int main()
{
list<int> l = { 1,2,3,4,5 };//C++11的语法
cout << l.front() << endl;
}
运行结果:
back
举个栗子:
int main()
{
list<int> l = { 1,2,3,4,5 };//C++11的语法
cout << l.back() << endl;
}
运行结果:
list modifiers
push_back
举个栗子:
int main()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
pop_back
举个栗子:
int main()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.pop_back();
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
push_front
举个栗子:
int main()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_front(10);
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
pop_front
举个栗子:
int main()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.pop_front();
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
insert
举个栗子:
int main()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
auto it = find(l.begin(), l.end(), 2);
l.insert(it, 20);
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
erase
举个栗子:
int main()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);
auto it = find(l.begin(), l.end(), 3);
l.erase(it);
for (auto e : l)
{
cout << e << " ";
}
cout << endl;
list<int> l2 = { 1,2,3,4,5,6,7,8,9,10 };
l2.erase(l2.begin(), l2.end());
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
swap
举个栗子:
int main()
{
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
l1.push_back(5);
list<int> l2;
l2.push_back(10);
l2.push_back(20);
l2.push_back(30);
l2.push_back(40);
l2.push_back(50);
l1.swap(l2);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
clear
举个栗子:
int main()
{
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
l1.push_back(5);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
l1.clear();
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
operator=
举个栗子:
int main()
{
list<int> l1 = { 1,2,3,4,5 };
list<int> l2;
l2 = l1;
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
remove
举个栗子:
int main()
{
list<int> l1 = { 1,2,2,4,5,5,6,2,9,2 };
l1.remove(2);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
splice
举个栗子:
int main()
{
//void splice (iterator position, list& x, iterator i);
list<int> l1 = { 1,2,3,4,5 };
list<int> l2 = { 10,20,30,40,50 };
auto it1 = find(l1.begin(), l1.end(), 2);
auto it2 = find(l2.begin(), l2.end(), 20);
l1.splice(it1, l2, it2);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
//void splice (iterator position, list& x);
list<int> l3 = { 1,2,3,4,5 };
list<int> l4 = { 10,20,30,40,50 };
auto it3 = find(l3.begin(), l3.end(), 2);
l3.splice(it3, l4);
for (auto e : l3)
{
cout << e << " ";
}
cout << endl;
for (auto e : l4)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
sort
举个栗子:
int main()
{
list<int> l1 = { 1,2,2,4,5,5,6,2,9,2 };
l1.sort();
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
return 0;
}
运行结果:
list的迭代器失效
错误例子:
int main()
{
list<int> l1 = { 1,2,3,4,5 };
list<int>::iterator it = l1.begin();
while (it != l1.end())
{
//在erase执行以后,it所指向的节点已被删除,因此it无效,在
// 下一次使用it时,必须先给其赋值
l1.erase(it);
it++; //it已经无效了,不能再使用迭代器++了,it不像string和vector是指针,在这里他是一个对象
}
return 0;
}
运行一下:
正确写法:
int main()
{
list<int> l1 = { 1,2,3,4,5 };
list<int>::iterator it = l1.begin();
while (it != l1.end())
{
l1.erase(it++); //it++后,it在erase前被更新,用它的返回值的迭代器(原来的it)来完成erase
}
return 0;
}
运行一下:
list和vector的对比
说明:本质上vector和list是互补的两个数据结构。
看到这里希望大家给博主点个关注~
下一篇更新list的模拟实现(这个还是有点小复杂的)~