C++读书笔记-字符串,vector和数组

来源:互联网 发布:网页制作美工 编辑:程序博客网 时间:2024/05/27 14:14
使用命名空间中的成员的两种方法:
1.std::cout; //直接使用
2.using std::cout //using声明

字符串string:
1.初始化string对象的6种方式

2.string对象的读写
①输出一个读入的string对象,忽略空格

②读取未知数量的string对象,以空格隔开


③按行读取string对象,包含空格


3.string的empty( )和size( ) 
①string的empty( )用于返回表示所判断的string对象是否为空。
②string的size( )用于返回string对象中字符的个数
▲注意:size( )返回的是一个string::size_type类型的值,这是一个无符号类型的值,不能拿该值和负值比较,因为负值会自动转换为一个较大的无符号值。
▲注意:在c++中,字符串字面值并不是string类型,当把string对象和字符字面值或者字符串字面值混在一条语句中时,必须确保每个+号两侧至少有一个是string。

4.访问和处理string中的字符:
①使用范围for语句,类似于java中增强的for循环:


如果要改变string中的字符,必须采用引用类型:


②使用下标运算符访问( [ ] ):


向量vector:
1.初始化vector的7种方式:


2.向vector中添加元素:
pushi_back( )方法可以向vector对象中添加元素,一般不指定vector的容量,在循环的时候动态地向vector中添加元素会更加高效。
▲注意:如果循环语句中包含向vector中添加元素的语句,就不能使用范围for循环。

3.vector的其它操作:
v.empty( ),v.size( )等等,都和string的函数方法差不多。
但是v.size( )返回的类型是由vector定义的size_type类型,
如vector<int>对应的返回类型是vector<int>::size_type类型,
而不是vector::size_type类型。


迭代器:虽然string和vector都可以通过下标访问元素,但并不是所有的容器都支持,所以可以通过迭代器访问容器中的元素。

1.begin( )返回指向第一个元素的迭代器
   end( )返回指向最后一个元素的下一个位置的迭代器

2.迭代器类型:
iterator 此迭代器能读写
const_iterator 此迭代器只能读不能写
begin( )和end( )返回的迭代器类型由具体的对象类型决定,但也可以通过cbegin( )和cend( )来返回const_iterator类型的迭代器。

3.要访问迭代器所指的对象,可以用解引用符*,如*it。
要访问元素的成员可以用点运算符,如(*it).empty( )。
箭头运算符(->)把解引用操作和成员访问操作结合到一起。
如it->empty( )相当于(*it).empty( )。

4.vector虽然可以动态增长,但是有两个限制:
①不能在范围for循环中向vector添加元素。
②任何一种改变vector对象容量的操作会使迭代器失效,即凡是使用了迭代器的循环体,都不要向迭代器所属容器添加元素。

5.迭代器运算:两个迭代器相减所得的结果是两个迭代器之间的距离,类型是difference_type,可正可负,所以是带符号类型。
例子:使用迭代器运算完成二分搜索。
#include<iostream>#include<conio.h>#include<vector>using namespace std;void search(vector<int> v,int m){ auto vb=v.begin(); auto ve=v.end(); auto vm=vb+(ve-vb)/2; while(vm!=ve&&*vm!=m){if(*vm<m){vb=vm+1;}else{ve=vm;}vm=vb+(ve-vb)/2; } if(vm==ve){cout<<"经过查找,不包含该元素"; } else if(*vm=m){auto vt=v.begin();cout<<"已经查找到该元素!位置在第"<<vm-vt<<"个"; }}int main(){vector<int> v;for(int i=0;i!=11;i++){v.push_back(i);}search(v,1);_getch();return 0;}


数组:
1.数组不同于vector的地方在于数组的大小是确定不变的,在定义数组的时候,数组的维度必须是一个常量表达式。
eg: constexpr int n=12; int a[n] ; //n必须是一个常量表达式

2.和内置类型一样,在函数体内定义某种内置类型的数组,默认初始化会令数组含有未定义的值,如果在函数体外定义,默认值由相应的类型决定。

3.c++中,不能将数组的内容拷贝给其他数组作为初始值,在java中是可以的。

4.存放指针的数组: int *array[10];
指向数组的指针: int (*array1)[10]=&array;
绑定数组的引用:int (&array2)[10]=array;

▲注意:不存在引用的数组,只有数组的引用。

5.数组有一个特征,数组名直接使用的话,编译器会自动的将其转换为一个指向数组首元素的指针。所以使用auto时,如果把数组名作为初始值,获得的类型是指针,但如果使用decltype,则获得的类型还是数组。

6.iterator头文件中定义了begin( )和end( )函数,功能和vector的begin( )和end( )一样,不过因为数组不是类,所以必须将数组名作为参数传入函数。

7.可以用空字符结束的字符数组来代替字符串字面值,即可以用c风格字符串来初始化string对象,但不能用string对象来初始化c风格字符串。
要用string对象的成员函数c_str( )来返回一个指向字符数组首元素的指针,返回类型为const char *。


0 0