YaoCheng8667 的个人博客 YaoCheng8667 的个人博客

记录精彩的程序人生

目录
《C++ Primer》 第三章:字符串,向量和数组
/    

《C++ Primer》 第三章:字符串,向量和数组

1. 标准库类型 string

1.1 使用 getline 读取一行

int main(){
  string line;
  while(getline(cin,line)){
    //每次读取一整行,直至文件末尾
    cout<<line<<endl;
  }
}

1.2 获取字符串长度

string s = "a string";
cout<<s.size()<<endl;
  • string 的 size()函数返回的类型是一个 size_type 类型的变量,具有一个无符号类型的值。
  • 一条表达式有 size()函数时最好不要使用 int 了,避免同时使用 int 和 unsigned 可能带来的问题。

1.3 字面值和字符串相加

  • 因为一些历史原因。也为了与 C 兼容,所以 C++ 语言中字符串的字面值不是 string 的对象,与 string 是不同类型。
string s1 = "hello";        string s2 = "world";
string s3 = s1 + "," + s2 + "\n";           //正确
string s4  = "hello" + ",";                 //错误,不能将字面值直接相加
string s5 = "hello" + "," + s2;
//错误,不能将字面值直接相加

1.4 字符串初始化方式

string s1;
string s2(s1);                              //s2是s1的副本
string s3("value");
string s3 = "value";
string s4(n,'c');                           //s4是由n个字符c组成的串

1.5 处理字符串中的字符

isalpha(c)                                  //是否为字母
isalnum(c)                                  //是否为字母或数字
isdigit(c)                                  //是否为数字
islower(c)                                  //是否为小写字母
isupper(c)                                  //是否为大写字母
ispunct(c)                                  //是否为标点符号(不为字母数字,可打印空白的一种)
tolower(c)                                  //大写字母则输出为小写,否则原样输出
toupper(c)                                  //转化为大写字母

1.6 使用基于范围的 for 语句处理字符串中的每个字符

string str("some thing");
for(auto c : str){
   cout<<c<<endl;
}

若要改变字符串中的字符,可以采用传引用的方式。

string str("some thing");
for(auto &c: str){
  c = toupper(c);
}

2.标准库类型 vector

2.1 定义和初始化 vector 对象

vector<T> v1;
vector<T> v2(v1);                           //v2中包含v1所有元素的副本
vector<T> v2 = v1;                          //同v2(v1)
vector<T> v3(n,val)                         //v3中含有n个值为val的值
vector<T> v4(n)                             //v4包含了n个执行初始值的对象
vector<T> v5{a,b,c ...}                     //v5包含了初始值个数的元素,每个元素被赋予了相应的初始值
vector<T> v5 = {a,b,c ...}                  //同v5{a,b,c ...}

2.2 vector SizeType

  • vector 要使用 sizetype,必须指定类型
vector<int>::size_type;                     //正确
vector::sizetype                            //错误

2.3 迭代器介绍

  • 迭代器类型 : 拥有标准库类型使用 iterator 和 const_iterator 来表示迭代器类型。const_iterator 和常量指针差不多,能读取但不能改变他的值。
vector<int>::iterator it;
string::iterator it2;

vector<int>::const_iterator it3; //it3为只读迭代器,只能读元素,不能写元素
vector<int>::const_iterator it4;

vector<int> v1;
auto it4 = v1.begin()            //it4为vector<int>::iterator类型
auto it5 = v1.cbegin()           //it5为vector<int>::const_iterator类型
  • 迭代器操作:
*iter                            //返回iter指向元素的引用
iter->mem                        //解引用并取元素,等同于(*iter).mem
++iter
--iter                           //返回容器下一个(上一个)元素
iter1 == iter2                   //指向同一个元素或同时指向容器尾部迭代器时为真
  • 迭代器运算:
iter + n                          //迭代器后移n个单位
iter1 - iter2                     //iter1元素与iter2之间距离的差值
//  >、>=、<、<=                       //比较两个迭代器指向的位置
  • 总结:
    迭代器可以看做一个指针,可以进行类似指针的解引用取成员函数,成员变量的方法。使用时,直接使用(容器名.begin())获取首个元素的迭代器并进行操作。
vector<int> a(10,0);
for(auto i = a.begin();i != a.end();i++){
  a[i] += i;
}

3. 数组

  • 数组的声明形如 a[d],其中,d 必须是一个常量表达式。
  • 数组声明类型不可使用 auto 进行推断。
  • 数组不允许直接拷贝和赋值。

3.1 数组显式初始化

const unsigned int sz = 3;
int a[sz];
int b[5] = {1,2,3};                  //利用初始值初始化考前元素,其余值为默认值,数组值为{1,2,3,0,0}
string s[3] = {"hi","bye"}           //数组初始值为{"hi","bye",""}

int d[] = {1,2,3,4,5};               //不指定size,直接初始化

3.1 理解复杂的数组声明:

int *ptr[10];                        //ptrs是一个含有10个整型指针的数组
int &ref[10];                        //错误:不存在引用的数组
int (*Parray)[10];                   //Parray指向一个含10个int类型整数的数组
int (&arrRef)[10];                   //arrRef是一个含10个int类型整数数组的引用

3.2 访问数组元素

使用数组下标时,可以将其定义为 size_t 类型。size_t 是一种机器相关的无符号整数,它被设计得足够大以便保存内存内任意对象的大小。

3.3 字符数组的特殊性

字符数组可以使用字符串初始化,但字符串末尾有一个'\0'空字符,也会被添加到字符数组中。

char a[] = {'c','+','+'};
char b[] = {'c','+','+','\0'};
char c[] = "C++";
char d[3] = "C++";                   //错误,没有空间可以存放空字符。

3.4 数组的指针与迭代器

在很多用到数组名字的地方,编译期会将其替换成指向数组首元素的指针。

string nums[] = {"one","two","three"};
string *p = nums;                    //p是一个指向nums[0]的指针

指向数组元素的指针有更多的功能(较与容器迭代器),vector 与 string 迭代器支持的功能,指向数组元素的指针均支持。C++11 新标准还引入了两个 begin()和 end()两个函数,返回指向数组收尾元素的指针。

int a[] = {1,2,3,4,5};
int *p = a;
++p;
int *p1 = begin(a);
int *p2 = end(a);
for(auto p1 = begin(a);p1!= end(a);i++){      //使用数组指针进行遍历
  cout<<*p1<<" ";
}

标题:《C++ Primer》 第三章:字符串,向量和数组
作者:YaoCheng8667
地址:https://ycisme.xyz/articles/2019/12/05/1575527111808.html