迭代器是一种遍历容器内元素的对象(指针).它使用了一种统一的访问元素的方式.
container_type::iterator iterator_name;
其中container_type是容器名字, iterator是容器提供的迭代器类型, iterator_name是迭代器对象的名称.如定义一个vector容器的迭代器对象
vector::iterator iter;
1: 输入迭代器
2: 输出迭代器
3: 正向迭代器
4: 反向迭代器
5: 随机访问迭代器
cbegin(), cend()迭代器:表示不能改变迭代器指向的内容不能被修改.
情况1:
不要在有迭代器使用的循环体类,不要改变迭代器的容量, 不然会造成迭代器失效.
#include
#include
int main()
{
using std::endl;
using std::cout;
std::vector::iterator iter;
std::vector arr{1, 2, 3, 4, 5, 6};
for (iter = arr.begin(); iter != arr.end(); iter++)
{
arr.push_back(45);
cout << *iter << endl;
}
return 0;
}
#include
#include
int main()
{
using std::endl;
using std::cout;
std::vector arr{1, 2, 3, 4, 5, 6};
std::vector::iterator iter = arr.begin();
std::vector::iterator it_end = arr.end();
while (iter != it_end)
{
arr.push_back(56);
cout << *iter << endl;
iter++;
}
return 0;
}
像这样会造成迭代器的失效, 为了避免迭代器的失效, 应该在第一次插入数据时就退出循环.
或者及时的更新迭代器指向.
#include
#include
int main()
{
using std::endl;
using std::cout;
std::vector arr{1, 2, 3, 4, 5, 6};
std::vector::iterator iter = arr.begin();
std::vector::iterator it_end = arr.end();
int cnt = -3;
while (iter != arr.end())
{
iter = arr.insert(iter, cnt);
cnt++;
if (cnt >= 1)
break;
iter++;
}
for (auto c : arr) cout << c << endl;
return 0;
}
情况2:
#include
#include
int main()
{
using std::endl;
using std::cout;
std::vector arr{1, 2, 3, 4, 5, 6};
for (auto iter = arr.begin(); iter != arr.end(); iter++)
{
arr.erase(iter); // 移除iter位置上的元素, 返回下一个元素的位置.
}
return 0;
}
修改容器的大小, 会造成迭代器失效.解决办法
#include
#include
int main()
{
using std::endl;
using std::cout;
std::vector arr{1, 2, 3, 4, 5, 6};
while (!arr.empty())
{
auto iter = arr.begin();
arr.erase(iter);
}
return 0;
}
#include
#include
int main()
{
using std::endl;
using std::cout;
std::string str = "I Love China";
for (auto iter = str.begin(); iter != str.end(); iter++)
{
cout << *iter;
}
return 0;
}
#include
#include
struct Serve_C
{
char itemname[100];
char itemid[100];
};
int main()
{
Serve_C* p1 = new Serve_C;
Serve_C* p2 = new Serve_C;
strncpy(p1->itemname, "Servename", sizeof(p1->itemname));
strncpy(p1->itemid, "1区", sizeof(p1->itemid));
strncpy(p2->itemname, "Serveid", sizeof(p2->itemname));
strncpy(p2->itemid, "100000", sizeof(p2->itemid));
std::vector S_List;
S_List.push_back(p1);
S_List.push_back(p2);
std::cout << S_List[0]->itemname << " " << S_List[0]->itemid << std::endl;
std::cout << S_List[1]->itemname << " " << S_List[1]->itemid << std::endl;
for (auto iter = S_List.begin(); iter != S_List.end(); iter++)
{
delete (*iter);
}
S_List.clear();
return 0;
}