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