C++ primer 学习笔记——迭代器

来源:互联网 发布:炫踪网络 编辑:程序博客网 时间:2024/05/08 01:39

迭代器与指针类似
只有string和vector等一些标准库类型有下标运算符
所以使用迭代器也能访问string对象字符和vector对象的元素
使用迭代器

auto b=v.begin,e=v.end();//end成员负责返回容器(或string)  尾元素的下一个位置 的迭代器,称为 尾后迭代器int arr[5]={0,1,2,3,4};vector<int> vec(begin(arr),end(arr));//数组初始化vector

迭代器与运算符
*it

#include<iostream>#include<string>using std::string;using std::cout;int main(){    string s("hello word");    if (s.begin() != s.end())    {        auto it = s.begin();        *it = toupper(*it);//*it返回迭代器it所指向的元素的引用    }    cout << s;    return 0;}

it++

#include<iostream>#include<string>using std::string;using std::cout;int main(){    string s("hello word");    for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it)//++it 使迭代器移动到下一个字符    //习惯使用 != 。所以标准迭代器都定义了!=而不是<        *it = toupper(*it);    cout << s;    return 0;}

(*it).num 和it->num 意思相同//解引用
解引用迭代器可获得迭代器所指向的对象,如果对象类型为类,有可能希望进一步访问其成员

//3.22对每个字符改成大写#include<iostream>#include<vector>#include<string>using std::string;using std::vector;using std::cout;using std::endl;int main(){    vector<string> v{ "hi", "i", "am", "amy" };    for (auto it = v.begin();it != v.end(); ++it)    {        for (auto &s1 = it->begin();s1 != it->end(); s1++)        //s1为string的迭代器,使用引用来改变字符串字符        {            *s1 = toupper(*s1);        }    }    for (auto c : v)        cout << c << " ";    return 0;}

迭代器类型

vector<int>::iterator it;string::iterator it2;vector<int>::const_interator it3;string::const_interator it4;

每个容器类定义一个名为interator的类型,该类型支持迭代器类型的一系列操作

end与begin运算符的返回值

vector<int> v;auto it1=v.begin();//auto 为 vector<int>::interator

使用迭代器运算——二分搜索

#include<iostream>#include<vector>using std::vector;using std::cout;using std::endl;int main(){    vector < int > num{0,1,2,3,4,5,6,7,8,9 };    int sought;    std::cin >> sought;    auto begin = num.begin();    auto end = num.end();    auto mid = num.begin() + (end-begin) / 2;    while (mid != end && *mid != sought)    {        if (*mid < sought)            begin = mid+1;        else            end = mid ;        mid = begin+(end - begin) / 2;//新的中点        //mid = (begin + end) / 2;/*Error 1   error C2678: binary '+' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>' (or there is no acceptable conversion)   h:\c++\project\11.5\11.5\erfensousuo.cpp    21  1   11.5*///+重载运算符的左右操作数类型不符合    }    cout << *mid;    return 0;}
0 0