向量和数组"/>
C++ 字符串、向量和数组
1、::作用域符,编译器应从操作符左侧名字所示的作用域中寻找右侧的名字。
2、拷贝初始化与直接初始化,直接初始化使用’=‘,拷贝初始化使用’='。
string
1、初始化
string s = “hello”;
string s(“hello”);
string s(10, ‘c’); s的内容为"cccccccccc"
2、string常用操作
操作符 | 功能 |
---|---|
os<<s | 将s写进输出流os中,返回os |
is>>s | 将is中读到的字符串赋值给s |
getline(is,s) | 从is中读取一行给s,返回is |
s.empty() | 判空操作 |
s.size() | 返回s中字符个数 |
s[n] | s中第n个字符引用,从0开始 |
s1+s2 | 字符串连接,但是需要注意不能两者都是字面值:“hello”,因为字符串字面值 != string,是不同的类型 |
s1 = s2 | 用s2为s1重新赋值 |
s1 == s2 | |
s1 != s2 | 两个字符串所含的字符是否完全一样,大小写敏感 |
<, <=, >, >= | 大小写敏感 |
cin>>s | 将string对象读入s,遇到空白停止 |
cout<<s | 输出 |
3、cctype头文件的函数
函数名 | 功能 |
---|---|
isalnum© | c为字母/数字时为true |
isalpha© | c为字母时为true |
iscntrl© | c为控制字符时为true |
isdigit© | c为数字时为true |
isgraph© | c不是空格但可以打印时为true |
islower© | c为小写字母时为true |
isprint© | c可打印(即c是空格/具有可视形式)时为true |
ispunct© | c为标点符号时为true |
isspace© | c为空白时为true |
isupper© | c为大写字母时为true |
isxdigit© | c为十六进制数字时为true |
tolower© | |
toupper© | 输出小写 |
输出大写 |
4、遍历字符串
for(auto c : str){
cout<<c<<endl;
}
vector
1、头文件与命名空间
#include
using std::vector;
2、定义和初始化vector对象
vector v1; | 默认初始化,v1为空vector |
---|---|
vector v2(v1); | v2中包含v1中所有元素的副本 |
vector v2 = v1; | 与vector v2(v1)效果相同 |
vector v3(n, val); | v3中包含n个元素,且值都为val |
vector v4(n); | v4包含n个元素,值都是T类型的初始值 |
vector v5{a,b,c,…} | 列表初始化,每一个值都给出了 |
vector v5 = {a,b,c,…} | 与vector v5{a,b,c,…}效果相同 |
:::info
圆括号提供的值是用来构建vector对象的;花括号提供的值是想列表初始化该vector对象,初始化时先用列表初始化,若不成功则进行其他初始化操作。
:::
3、vector常见操作
函数 | 功能 |
---|---|
v.push_back(t) | v的后端添加一个值为t的元素 |
v.empty() | 判空操作 |
v.size() | 返回v中元素个数 |
v[n] | 返回v中第n个元素引用,从0开始 |
v1 = v2 | 用v2中的元素拷贝替换v1中的元素 |
v1 = {a,b,c,…} | 用列表中的元素拷贝替换v1中的元素 |
v1 == v2 | |
v1 != v2 | 两个vector对应元素相同 |
<, <=, >, >= | 按字典顺序比较 |
vector不能使用下标来添加元素:
vector x;
x[0] = 1; //错误
x.push_back(1);//正确
迭代器
提供对对象的间接访问,有迭代器的类型都拥有begin和end。
标准容器迭代器的运算符
*iter | 返回迭代器iter所指元素的引用(元素值) |
---|---|
iter->mem | 等价于(*iter).mem,解引用iter获取该元素名为mem的成员 |
++iter | 令iter指向下一个元素 |
–iter | 令iter指向上一个元素 |
iter1 == iter2 | |
iter1 != iter2 | 判断两个迭代器指向的是否为同一元素 |
循环遍历迭代器:
string s("some string");
for(auto it = s.begin(); it != s.end(); ++it){// 利用*it取值
}
迭代器运算(vector与string支持)
iter+n | 向前移动n个元素 |
---|---|
iter-n | 向后移动n个元素 |
iter+=n | iter位置加n,结果赋给iter |
iter-=n | iter位置减n,结果赋给iter |
iter1 - iter2 | 返回两者之间的距离,iter1与iter2必须指向同一容器中元素或尾元素的下一个位置 |
>, >=, <, <= | 位置比较 |
指针的比较
只要两个指针指向同一数组的元素就可进行比较。
指针加一个整数返回的结果还是指针:
int ia[] = {0,2,4,8};
int last = *(ia + 4); //ia[4]的值
int last = *ia + 4; //ia[0]的值 + 4
c标准库string函数
需要头文件 string.h
函数名 | 功能 |
---|---|
strlen(s) | 返回s的长度,空字符不算在内 |
strcmp(s1, s2) | 比较s1与s2,s1==s2时,返回0,s1 < s2时,返回负值 s1 > s2时,返回正值 |
strcat(s1, s2) | s2附加到s1之后,返回s1 |
strcpy(s1, s2) | 将s2拷贝给s1,返回s1 |
:::info
注:传入此类函数的指针必须指向以空字符作为结束的字符数组。
char ca[] = {‘c’,‘+’,‘+’};//但是 ca[]=“c++” 可以,因为默认会自动增加一个结束符 ‘\0’
cout << strlen(ca)<<endl;//错误
:::
对于string对象,可以直接比较大小与连接;而对于c风格字符串,则需要使用strcmp()、strcat()来进行比较与连接。
因为使用数组时,真正使用的是指向数组首元素的指针,而这样比较的其实是char*的值,但是这两个不是指向同一对象,不能进行比较。string与c风格字符串转换:string可以通过c_str()转换为c风格字符串。
string s = “hello”;
char *str = s.c_str();
数组
初始化
int a[n] = {0,1,2,3,..}; //n列
int a1[] = {0,1,2} //三列string b[] = "c++";//b是四列,字符数组最后有一个空字符 '\0'
string b[] = {'c','+','+'};//b是三列
不能将数组的内容拷贝到其他数组作为初始值,也不能用数组为其他数组赋值,但是可以利用数组初始化vector:
int arr[] = {1,2,3,4};
vector<int> ivex(begin(arr), end(arr));
特殊数组声明
int *ptrs[10]; //ptrs为含有10个整形指针的数组int (*parray)[10] = &arr; //parray指向一个含有10个元素的数组int (&arrRef)[10] = arr; //arrRef引用一个含有10个元素的数组
多维数组
c++中没有多维数组,即没有数组的数组,需要使用多个维度表示。
初始化方式:
int ia[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}
};int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};int ia[3][4] = {0,1,2,3}; //显式初始化第一行,其他元素执行值初始化int ia[3][4] = {{0},{4},{8}};//显式初始化每一行首元素
c++11中利用for语句处理多维数组
size_t cnt = 0;
for(auto &row : ia){for(auto &col : row){col = cnt;++cnt;}
}
将控制变量声明为引用类型,是为了避免数组被自动转换成指针。
其中最外层(row)必须定义为引用,如果不修改值 col可以不用定义为引用。若row、col都不定义引用,则编译报错。
更多推荐
C++ 字符串、向量和数组
发布评论