C++primer第三章

  •  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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值