如下一个程序进行演示讲解
#include <list> 需要包含该迭代器
template <typename T>
void print(T Begin, T end)
{
for (T i = Begin; i != end; ++i)
{
std::cout << *i << std::endl;
}
std::cout << std::endl;
}
int main()
{
std::list<int> obj(5,123); 定义一个int类型5个元素初始化为123的双向链表,obj是迭代器,该迭代器是struct std::bidirectional_iterator_tag 双向迭代器 支持++ -- != == = * ,不支持[] + - += -=
std::list<int>::iterator it = obj.begin(); 定义一个迭代器有两种方式,此时是第一种方式定义
std::cout << *it << std::endl; 打印值为123
print(obj.begin(), obj.end()); 模板函数也可以应用
for (size_t i = 0; i < 5; i++) 遍历初始化该双向链表容器
{
*it = i;
it++;
}
auto endit = obj.end(); 此时为另一种方式定义迭代器
endit--; 指向尾部前一个
std::cout << *endit << std::endl; 打印4
print(obj.begin(), obj.end());从头到尾打印
obj.push_back(666); 尾部插入666
obj.push_front(111); 头部插入111
auto bit = obj.begin(); 再次定义一个迭代器
由于只有随机访问迭代器支持直接任何位置插入或删除,所以下面讲述list容器任意位置的插入和删除
for (size_t i = 0; i < 5; i++) 利用for循环进行任意位置的插入
{
bit++;
if (i == 3)
{
obj.insert(bit, 5,555); 在bit这个位置插入5,555,可以一次插入多个元素
break;
}
}
只有随机访问迭代器支持直接任何位置插入或删除
obj.front() = 12138;
obj.back() = 128;
print(obj.rbegin(), obj.rend()); 基于反向迭代器的遍历,从后到前打印
obj.pop_back(); 尾部元素弹出
obj.pop_front(); 头部元素弹出
for (size_t i = 0; i < 5; i++) 从任意位置弹出元素
{
bit++;
if (i == 3)
{
obj.erase(bit);
break;
}
}
obj.erase(obj.begin(),obj.end()); 指定范围内所有元素弹出
obj.clear(); 清空该容器所有元素
system("pause");
return 0;
}