vectorivec; //... vector ::iterator mid = ivec.begin() + ivec.size()/2; //OK list ilist(ivec.begin(),ivec.end()); list ::iterator iter = ilist.begin() + ilist.size()/2; //Error list ::iterator iter1 = ilist.begin(), iter2 = ilist.end(); if (iter1 < iter2) //Error { //... }
list容器的迭代器既不支持算术运算符,也不支持关系运算符,它只是提供前置/后置的自增、自减运算以及相等/不等运算。
//P270 习题9.9
int main()
{
list
iList;
for (size_t i = 0; i != 15; ++i)
{
iList.push_back(i+1);
}
for (list
::iterator iter = iList.end(); iter != iList.begin();) { cout << *(--iter) << endl; } }
1、对形成迭代器范围的迭代器的要求
迭代器 first和last如果满足以下条件,则可形成一个迭代器范围:
它们指向同一个容器中的元素或超出末端的下一位置。
如果这两个迭代器不相等,则对first反复做自增运算必须能够到达last。换句话说,在容器中,last绝对不能位于first之 前。【P270,编译器自己也不能保证上述要求】
2、使用左闭右开区间的意义
1)当first与last相等,迭代器范围为空
2)当first与last不相等时,迭代器范围内至少有一个元素:size= last fist
//P271 习题9.12 bool findVal(vector::const_iterator beg,vector ::const_iterator end,int val) { while (beg != end) { if (*beg == val) { return true; } ++ beg; } return false; } int main() { vector ivec; for (int i = 0;i != 20; ++i) { ivec.push_back(i); } vector ::const_iterator mid = ivec.begin() + ivec.size()/2; cout << findVal(ivec.begin(),ivec.end(),10) << endl; cout << findVal(ivec.begin(),mid,10) << endl; }
//习题9.13 vector::const_iterator findVal(vector ::const_iterator beg, vector ::const_iterator end, int val) { while (beg != end) { if (*beg == val) { return beg; } ++ beg; } return beg; }
//习题9.14
int main()
{
// freopen("input","r",stdin);
vector
strVec;
string val;
while (cin >> val)
{
strVec.push_back(val);
}
for (vector
::iterator iter = strVec.begin(); iter != strVec.end(); ++iter) { cout << *iter << endl; } }
//习题9.15
int main()
{
// freopen("input","r",stdin);
list
strVec; //修改vector -> list
string val;
while (cin >> val)
{
strVec.push_back(val);
}
//修改vector -> list
for (list
::iterator iter = strVec.begin(); iter != strVec.end(); ++iter) { cout << *iter << endl; } }
3、使迭代器失效的容器操作
一些容器的操作会修改容器的内在状态或移动容器内的元素。这样的操作使所有指向被移动的元素的迭代器失效,也可能同时使其他迭代器失效。使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的问题。使用无效迭代器将会导致严重的运行时错误。
无法检查迭代器是否有效,也无法通过测试来发现迭代器是否已经失效。任何无效迭代器的使用都可能导致运行时错误,但程序不一定会崩溃,否则检查这种错误也许会容易些o(∩∩)o...。
【建议:】
使用迭代器时,通常可以编写程序使得要求迭代器有效的代码范围相对较短。 然后,在该范围内,严格检查每一条语句,判断是否有元素添加或删除,从而相应地调整迭代器的值。