C++笔记 字符串、向量和数组

本文详细介绍了C++中字符串(string)的操作方法,包括初始化、读取、比较及常用函数。同时,深入探讨了vector容器的使用,包括初始化、迭代器的运用,以及与string类型的区别。此外,还讲解了C风格字符串的处理技巧和数组的基本概念。

using声明可以使程序无须专门的前缀使用名字。

using namespace :: name;
using std :: cin; std :: cout;  //用到的每个名字都必须有自己的声明语句,而且每句话都得以分号结束

头文件不应包含using声明。

定义和初始化string对象C

string s1;      //默认初始画,s1是空字符串
string s2 = s1;
string s3("value");
string s4(10, 'c');      //s4是 cccccccccc

如果是执行(=)实际上是拷贝初始化,编译器把等号右侧初始值拷贝到新创建的对象中,如果不用等号,则是直接初始化。

string操作

os << s		将s写到输出流os当中,返回os
is >> s		从is中读取字符串赋给s,字符串以空白符分隔,返回is
getline(is, s)		从is中读取一行赋给s,返回is
s.empty()		s为空返回true,否则false
s.size()		返回s中字符的个数
s[n]		返回s中第n个字符的引用,位置从0开始计算
s1 + s2		返回s1和s2连接后的结果
s1 == s2		如果s1和s2中所含字符完全一样,则相等,对大小写敏感
<, <=, >, >=		利用字符在字典顺序比较,对大小写敏感,比较的是第一对相异字符

.length()和.size()都是遇到‘\0’结束,不包括’\0’;
sizeof()统计字符串所占空间大小,包含‘\0’, 只对字符数组有效,若要使用字符串,必须用字面值。
strlen必须将str转化为c语言使用: strlen(str.c_str())

string执行读取操作时,会忽略开头的空白,并读到下一处空白。若输入“ hello world ”,则实际为“hello”

读取未知数量的string

int main()
{
	string word;
	while(cin >> word)
		cout << word << endl;
	return 0;
}

遇到文件结束标记或非法输入结束。
保留字符串中的空白符,则使用getline,getline读取到换行符为止(读取时包含换行符,但存入string时不存换行符),触发getline函数返回的换行符实际上被丢弃了

int main()
{
	string line;
	while(getline(cin, line))
		cout << line << endl;
	return 0;
}

size函数返回的是一个string :: size_type类型的值,是一个无符号类型的值,且能足够存下任何string对象的大小。
如果一条表达式中已经有了size函数尽量不使用int,以避免混用int和unsigned可能出现的问题。

注:c++中字符串字面值并不是标准库类型string的对象。

cctype头文件的函数

isalnum(c)		当c是字母或数字为真
isalpha(c)		当c是字母为真
iscntrl(c)		当c是控制字符时为真
isdigit(c)		当c是数字时为真
isgraph(c)		当c不是空格但可打印时为真
islower(c)		当c小写为真
isprint(c)		当c可打印(即c是空格或具有可视形式)为真
ispunct(c)		当c是标点符号为真
isspace(c)		当c为空白(即空格、横向制表符、回车符、换行符、进纸符)为真
issupper(c)		当c大写为真
isxdigit(c)		当c为十六进制为真
tolower(c)		输出小写
toupper(c)		输出大写

Vector初始化

vector<T> v1
vector<T> v2(v1)        /         vector<T> v2 = v1
vector<T> v3(n, val)              v3包含了n个重复元素,值都为val

c+11新增列表初始化

vector <string> articles = {"a", "an", "the"};

引用不可以成为vector的元素,因为其不是对象。
只能使用直接初始化,不可以使用拷贝初始化(vector之间的拷贝是可行的,但要保证类型相同)

迭代器
通过begin返回指向第一个元素/字符的迭代器。
end返回指向容器/string对象“尾元素的下一位置”的迭代器,没有实际含义,仅是个标记,表示已处理完容易中所有元素。
若容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。

迭代器的运算符

*iter		返回迭代器iter所指元素的引用
iter->mem		解引用,等价于		(*iter).mem
++iter		指向容器下一元素
--iter		指向上一元素
iter1 == iter2		若两个迭代器指示的是同一个元素或都是同一容器的尾后迭代器,则相等

迭代器类型

vector<int> v;
const vector<int> cv;
auto it1 = v.begin();		//it1的类型是vector<int>::iterator
auto it2 = cv.begin();		//it2的类型是vector<int>::const_iterator

c+11新引入,cbegin和cend返回的是vector::const_iterator,用于只读不写的操作对象。

如果迭代器指向的容器位置在另一个迭代器所指位置之前,则说前者小于后者。
迭代器和一个整数值相加(相减),返回值是向前(向后)移动了若干位置的迭代器。
两个迭代器的距离类型是difference_type

数组
数组中的维度必须是常量表达式。拷贝和复制数组不允许。

string sa[10];		//sa数组为空
int ia[10];		//ia数组含有10个整数,皆为0
int main(){
	string sa2[10];		//sa2数组为空
	int ia2[10];		//ia2数组含有10个整数,在函数体内,值不确定
}

函数体内的局部变量分配在栈里,定义变量只是给了它一个临时的地址,而地址中原来是有数据存在的,是未知的不确定的

c+11新引入,begin/end函数,定义在iterator头文件中

int ia[] = {0,1,2,3,4,5,6,7,8,9};
int *beg = begin(ia);		//指向ia首元素
int *last = end(ia);		//指向arr尾元素的下一位置的指针

C风格字符串的函数

strlen(p)		//返回p长度,不计入空字符
strcmp(p1,p2)		//如果p1==p2,返回0;如果p1>p2,返回正值;如果p1<p2,返回负值
strcat(p1,p2)		//将p2附加到p1后,返回p1
strcpy(p1,p2)		//将p2拷贝给p1,返回p1

比较字符串

string s1 = /..../
string s2 = /.../
if(s1 < s2)		//可比较
const char ca1[] = /..../
const chat ca2[] = /.../
if(ca1<ca2)		//不可比较,两个指针非指向同一对象
if(strcmp(ca1,ca2) < 0 )		//正确

使用范围for语句处理多维数组

https://blog.youkuaiyun.com/timchaosh/article/details/66478161

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值