使用命名空间中的成员的两种方法:
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 *。