-
3.3 vector容器
- vector初始化的真正含义依赖于圆括号还是花括号,eg.
vector<int>v1(10)//v1有10个元素,每个元素都是0
vector<int>v1{10}//v1有1个元素,值为10
vector<int>v1(10,1)//v1有10个元素,每个的值为1
vector<int>v1{10,1}//v1有2个元素,值为10和1
圆括号是表明vector对象的容量
花括号是列表初始化,里面的值代表元素的初始值
- vector对象中元素的访问使用范围for语句
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int a;
vector<int>v1;
while(cin>>a)
{
v1.push_back(a);
}
for(auto c:v1)//范围for循环
cout<<c<<endl;
return 0;
}
vector内对象的索引:v1[i],类似数组的索引,i从0开始,只能对已经存在的元素进行下标索引操作,
习题3.17
#include <iostream>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
string a;
char j='u';
vector<string>v1;
while(cin>>a)
{
v1.push_back(a);
}
for(auto &x:v1)
{
for(auto &c:x)
{
c=toupper(c);//c的值修改后记得赋给c
}
cout<<x<<endl;
}
return 0;
}
-
3.4 迭代器
迭代器的使用大同小异,首先定义一个迭代器指向容器的第一个对象,使用迭代器进行for循环对容器内的对象进行操作,有点类似于数组下标的含义,但是迭代器表示的是容器内对象的“下标”。
习题3.21
#include <iostream>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
int a;
vector<int>v1;
while(cin>>a)
{
v1.push_back(a);
}
for(auto it=v1.cbegin();it!=v1.cend();++it)//迭代器的使用主要是这句话
cout<<*it+*(it+1)<<endl;
return 0;
}
习题3.22
#include <iostream>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
int a;
vector<int>v1;
for(int i=0;i<10;i++)
{
cin>>a;
v1.push_back(a);
}
for(auto it=v1.cbegin();it!=v1.cend();++it)
cout<<2*(*it)<<endl;
return 0;
}
习题3.24
#include <iostream>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
int a;
vector<int>v1;
while(cin>>a)
{
v1.push_back(a);
}
for(auto it1=v1.begin(),it2=v1.end();it1!=it2;++it1)
{
--it2;//注意end()指向容器尾元素的下一位置,所以要先减1,使it2指向最后一个元素
cout<<*it1+*it2<<endl;
}
return 0;
}
习题 3.36
int main()
{
vector<int>v1={1,2,3,6,5};
vector<int>v2={1,2,3,4,5};
int flag =0;
if(v1.size()!=v2.size())
{
cout<<"不相等"<<endl;
}
else
{
for(auto a=v1.begin(),b=v2.begin();a!=v1.end();a++,b++)//注意b前面不要申明auto
{
if(*a!=*b)
{
flag=1;
break;
}
}
if(flag==0)
{
cout<<"相等";
}
else
cout<<"不相等";
}
}
- string类型字符串和c风格类型字符串的转换:使用strings对象的c_str()函数
string s(“hello”);
char *p=s.c_str();//将s转换成一个c风格类型的字符串,使用指针p指向它。
习题3.42
int main()
{
int a[]={1,2,3,4,5};
vector<int>v1(begin(a),end(a));
int a2[5]={0};
int i=0;
for(auto b=v1.begin();b!=v1.end();++b)
{
a2[i]=*b;
++i;
}
}
- 多维数组的下标引用
int ia[2[3]={0};
int(&row)[4]=ia[1];//将row与数组ia的第二行绑定
- 多维数组的遍历可以使用范围for循环
除了最内层的引用,所有的循环控制变量都是引用类型!!!!
下面程序1错误,2正确
使用引用的原因:如果不使用引用,系统会将row当做一个数组首地址的指针
1.for(auto row:ia)
for(auto col:row)
2.for(auto &row:ia)
for(auto col:row)
- 指针和二维数组
int ia[2][3]={0};
int*p[3]=ia[3]//指针p指向ia的第一行
指针操作数组的方式:
for(auto p=a; p!=a+2; p++)//使用auto指针遍历二维数组,和下面作对比
for(auto q=*p; q!=*p+3; ++q)
cout<<*q<<endl;
for(int (*p)[3]=a; p!=a+2; p++) //不使用auto指针遍历数组
for(int* q=*p; q!=*p+3; ++q)
cout<<*q<<endl;
范围for循环操作数组的方式:
for(auto &r:a)//范围for循环遍历二维数组
for(auto c:r)
cout<<c<<endl;