一、迭代器介绍
使用下标运算符可以访问string对象的字符或vector对象的元素,而迭代器也可以实现同样的机制,而且更加通用,所有标准库容器都可以使用迭代器,但只有一少部分才同时支持下标运算符。有效的迭代器可以指向某个元素或者指向容器中最后一个元素的下一位置。
二、迭代器的使用
vector v(10);
auto b= v.begin(),e=v.end();//b表示v的第一个元素,e表示v最后一个元素的下一位置
若容器为空,则begin和end返回同一个迭代器。
结合解引用和成员访问操作的两种方法
①(*it).men //(记得加括号)
②it->men
例:
vector v{"asdas","dd","ff",""}; auto it = v.begin(); it += 3; if ((*it).empty())//解引用后再通过点运算符访问其成员的话,解引用部分要加() { cout << "空!" << endl;
}
if (it->empty()) { cout << "空!" << endl; }
但凡使用了迭代器的循环体,都不要向迭代器所属容器添加元素(添加元素会使迭代器失效)
三、数组
int arr[10]; //定义一个装有10个整数的数组
int *ptrs[10]; //ptrs是一个装有10个整型指针的数组
int &refs[10]=/*?*/ //错误,引用不是对象
int (*parray)[10] =&arr; //定义一个指针,指向含有10个整数的数组
int (&arrRef)[10]= arr; //定义一个引用,引用一个含有10十个整数的数组
不允许整个数组的拷贝和赋值
auto ia[]={0,1,2,3,4,5,6,7,8,9};//ia是一个含有10个整数的数组
int a2=ia;//错误
auto ia2(ia);//正确,但ia2是一个整型指针,指向ia的第一个元素
decltype (ia) ia3={0,1,2,3,4,5,6,7,8,9};//ia3是一个含有10个整数的数组
指针也可以像迭代器一样使用:
不过数组毕竟不是类类型,因此这两个函数不是成员函数,正确的使用形式是将数组作为函数的参数
int ia[]={0,1,2,3,4,5,6,7,8,9};//ia是一个含有10个整数的数组
int *beg=begin(ia);//指向ia首元素的指针
int *end=end(ia);//指向ia尾元素的下一个位置的指针
四、C风格字符串
传入此类函数的指针必须指向以空字符作为结束的数组
例:
char ca[]={‘c’,’+’,’+’};
cout << strlen(ca)<<endl;//严重错误,ca没有以空字符结束
混用string对象和c风格字符串:
1、允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值
2、在string加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象
但以上性质反过来就不适用了
不能直接用string对象直接初始化指向字符的指针,需要借助一个c_str的成员函数
例:
char c1[] = "hello";
string s1 = c1;//允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值
string s2 = s1 + c1;//在string加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象
//但以上性质反过来就不适用了
char* str = s1;//错误,不能用string对象初始化char*
const char* str1 = s1.c_str();//正确,但s1若被改变,这个指针指向的东西就没用了,最后重新拷贝一份
用数组初始化vector对象:
不允许用数组为另一个数组赋值,也不允许用vector给数组赋值,但是有种方法可以将数组赋给vector,只需要指明数组首元素地址和尾后地址即可int int_arr[]={0,1,2,3,4,5};
vector ivec(begin(int_arr),end(int_arr));
使用范围for语句处理多维数组
当处理多维数组的时候,要将外层循环的控制变量声明成引用类型,这是为了避免数组被自动转换成指针。
例:
for (auto &row:arr)
for(auto col:row)
cout<<col<<endl;
特别注意:
int ia[3][4] = { 0 };
for (auto p = ia; p != ia+3; p++)//p指向含有4个整数的数组
{
for (auto q = *p; q != *p + 4; q++)//q是指向含有4个整数数组的首元素,也就是说q指向一个整数
{
cout << *q << " ";
}
cout << endl;
}