C++ Primer 学习笔记-第三章(string + vector)

此笔记仅记录容易忘记的知识点,对于已经掌握或者比较容易的知识点,此笔记将不涉及。

3.1 命名空间的using声明  (简化总是需要输入std::cin,而使用cin即可)

 使用::符号可以确定和读取特定命名空间内部的名字:

                            

//before:

std::cin >>xxx;
std::cout<< xxx <<std::endl;

//after:
using std::cin,std::cout;

int main(){

    cout <<xxx <<endl ;
    cin >> xxx 
}

3.2 标准库类型string (可变长的字符序列)

基本使用方法:1. 引用string头文件: #include <string>

                          2.使用using命名空间(确定string的作用域): using std::string;

                          3.使用string定义变量即可

  3.2.1 定义和初始化string对象

    除了标准初始化之外,还有以下几个初始化方法:

    直接初始化和拷贝初始化:直接初始化就是使用c++11里面的最新初始化方法: string s1(xxx);

                                                拷贝初始化就是使用 = 进行赋值;

#include <string>
using std::string;

int main(){
   string s1;
   string s2=s1;
   string s3="hiya";
   string s4(10,'c'); //s4的内容为cccccccccc

//使用c++全新的定义方法:
   string s2(s1);
   string s3("hiya");

}

  3.2.2 string对象上的操作

                                      

int main(){
  
//读写string 对象
    string s;
    cin >>s;
    cout <<s;
return 0;

}

  3.2.3 string的比较/相加

  •        string 比较原理:

              

  •      string 相加原理:实际上就是将前一个字符串和后一个字符串连接成一个新的字符串
  •       string 字面值相加原理:语法:string s4 =s1+ "xxx"+s2; 

 

  3.2.4 处理string对象中的字符(大小写转换/有无空格等)

                       

                      

 

3.3 标准库类型 (vector)-一种容器

标准库类型vector 表示对象的几何,其中所有对象的类型都相同,是容纳着其他对象,被称为容器(container)

vector 是一种类模板(class template),而非类型,因此需要在实例化的时候指定变量类型。

  • 基本使用方法:1. 引用vector头文件: #include <vector>

                          2.使用using命名空间(确定vector的作用域): using std::vector;

                          3.实例化vector :语法为:

                                                                  vector<int> ivec;

                                                                  vector<Sales_item> Sales_vec;

                                                                  vector<vector<string>> fle; 

3.3.1 定义和初始化vector对象

总结一点:vector<T> v1; 定义类型和vector名称,然后向内添加内容

                           

                                 

如何区分初始化时,(){}的含义: 

//区分以下(){}含义:

vector<int> v1(10);   //十个元素,全是0
vector<int> v2{10};  //一个元素,值为10

vector<int> v3(10,1); //十个元素,值为1
vector<int> v4{10,1}; //两个元素,10,1

                          

3.3.2 向vector对象里面添加元素 (使用push_back语句)

           声明vector->push_back

          注意!!不可使用下角标形式添加元素(vector<int> i; i[0]=1-->错误!!)

          只能对确定存在元素的下角标值的对象进行操作。

vector<int> v1; //定义一个空vector
vector<string> v2;
string str;

for(int i=0; i!=100 ;++!){
    v1.push_back(i);
}


while(std::cin>>str){
    v2.push_back(str);
}

 

3.3.3 其他vector操作

                       

                      

3.4 迭代器介绍 (iterator)

                     

                                

           3.5 数组:

  •                 数组是一种类似于Vector的数据结构,存放相同类型对象的容器 ; 数组大小确定不变。
  •                 阅读数组时,采用由内至外,由右至左的阅读方式
//1.定义和初始化数组 (数组内元素的个数必须时已知的)

unsigned cnt =42; //不是常量表达式
constexpr unsigned sz=42; //常量表达式

int arr[10];    //正确
int *parr[sz];  //正确
string bad[cnt];//错误


//2.显式初始化数组元素(直接赋值方式)
const unsighed sz =3;
int ial[sz]={0,1,2};
int a2[]={0,1,2};   //自动设置为维度是3的数组
int a3[5]={0,1,2};  //{0,1,2,0,0}
string a4[4]= {"as","Hello"} //{as,hello,"",""}

//3.注意,数组不允许拷贝和赋值,不允许使用一个数组初始化另一个数组
int a[]= {0,1,2};
int a2[]=a;  //错误!!

//4.复杂的数组声明
int *ptrs[10]; //含有10个整型指针的数组
int &refs[10]=xxx; //错误,不存在引用的数组
int (*ptrs)[10]= &arr; //指向一个含有10个整数的数组
int (&arrref)[10]= arr ; //引用一个含有10个整数的数组

                   

         3.5.1 访问数组元素

//c++访问数组内部元素时,与vector类似,可以采用[]的形式
//在头文件cstddef中,定义了size_t的类型,在设置和遍历数组时,使用这个比int好用
//因为size_t的范围足够大

例如:
#include <cstddef>
$include <iostream>

using std::cin;
using std::cout;

unsigned size_t count=11;
unsigned score[count];
unsigned grade;

while(cin>>grade){
    if(grade<= 100){
        ++score[grade/10];
}
}

//遍历
for(auto i :score){
        cout<<i <<endl;    
}
//或者
for(size_t ix=1; ix<=array.size;++ix){

}

 3.5.3 数组和指针

数组特性:在用到数组名字的地方,系统会自动将其替换为一个指向数组首元素的指针

int ia[]={1,2,2,3,4,5,6};
auto ia2(ia); //ia2是一个整型指针,指向数组第一个元素
ia2=42; //错误!!

 3.5.4 指针也是迭代器(类似与vector里面的begin,end)

                    

 3.5.5 指针运算

                                    

 3.5.6 使用数组可以对vector对象进行初始化

                    

Improtant tips 尽量使用标准库类型,而非数组

(尽量使用vector和迭代器,避免使用内置数组和指针,尽量使用string,避免使用C风格的基于数组的字符串)

 

 3.6 多维数组(C++内没有多维数组,所谓多维数组,其实是:数组中的数组

                  

//多维数组的定义和初始化:

int ia[3][4]={   //3行,4列
    {0,1,2,3},//这个数组内,由三个对象,每个对象内又有4个对象
    {4,5,6,7}, 
    {8,9,10,11}
};

//多维数组的下标引用:
例如:
ia[2][3] =arr[0][0][0];