C++学习笔记,第三章字符串string向量vector和数组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

`本文主要记录一下标准库类型string和vector和数组的基本使用知识。


一、标准库类型string

标准库类型string表示可变长的字符序列,使用string类型必须包含string头文件#include<string>

3.2.1定义和初始化string对象

                      初始化string对象的方式
string s1   //默认初始化,s1是一个空串
string s2(s1) //s2是s1的副本,也就是把s1的值拷贝给s2
string s2=s1  //s2是s1的副本,“=”是拷贝初始化,把s1的初始值拷贝到新创建的对象上
string s3="hello" //s3是字面值“hello”的副本
string s3="hello" //拷贝,常用的初始化
string s4=(n,'c') //把s4初始为n个连续字符c组成的串

3.2.2string对象上的操作

os<<s将s写到输出流os中返回os
is>>s从is读取字符串给s,字符串以空白分隔,返回is
getline(is,s)从is中读取一行给s,返回is
s.empty()string的成员函数,判断s是否为空,为空返回true,否则返回false
s.size()返回s中的字符个数
s[n]返回s中第n个字符的引用,n从0开始。跟字符数组类似
s1=s2用s2中的字符代替s1中原来的字符
s1==s2从s1和s2第一个字符开始比较,按照字典序,其中同一字母大写大于小写
s1!=s2
<,<=,>,>=按照字典序比较,对大小写敏感

读写string对象
注意cin>>s 时,string对象会自动忽略开头的空格,制表符换行符,遇到空白会停止。
但是getline不同,会读取空白,遇到换行符才停止。
getline的使用

string s;
getline(cin(输入流),s);

string对象相加

1.两个string对象相加,这里用到了运算符重载

string s1="hello",s2="world";
string s3=s1+s2;//s3就是"helloworld",把s2附到s1后面
s1+=s2;//等价于s3=s1+s2;

2.字符字面值和string相加
注意字面值的类型和string不同,只不过编译器会自动转换.

string s1="hello",s2="world";
string s3=s1+','+s2+'!';
//s3就是 hello,world!

注意:这里的运算符“+”两边至少有一个是string类型对象,这是运算符重载的知识,不会的小伙伴,可以取看看运算符重载。

3.2.3处理string对象中的字符

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

//基本语法
for(declaration:expression)
{
   statement
}

expression 是一个对象,用于表示一个序列。 declaration 部分负责定义一个变量,这个变量用来访问 序列中的每一个基础元素。每次迭代,declaration部分都会被初始为expression的下一个元素值。
例子:

string s="hello world!";
//每行输出s中的一个字符
for(auto c:s)
{
cout<<c<<endl;
}
// 这里的auto 是类型说明符,编译器根据变量 c自动推导c的类型

如果是改变string中的字符,看下面一个例子:

string s="hello world!";
//令s中小写字母变为大写
for(auto &c:s)
{
   c=toupper(c);
}
//为什么这里用引用呢,如果用auto c,以第一个字符为例,我们把‘h’拷贝给c,然后令c由小写变为大写,但是s中的‘h'没有改变啊。
//如果是auto &c,c是'h'的引用,绑定'h',那么改变c就是改变h。因为引用本质上是一个指针常量。感兴趣的小伙伴可以去看看引用的知识。

只改变个别字符?

有两种方法:一是使用下标运算符[],另一种是使用迭代器。
下标运算符接受的参数为 string::size_type.不是int类型,它也是一个无符号整数

string s="some time";
//把s的第一个字符改为大写
if(!s.empty())
{
  s[0]=toupper(s[0]);
}

标准库类型vector

标准库类型vector表示对象的集合,其中所有对象的类型一致。集合中每个对象都有与之对应的‘引索’,可以用来访问对象。因此,vector 也可以称为“容器” 包含着一个个对象。
要使用vector 要包含头文件vector。
很明显,vector这个容器里装的对象的类型并不知道,它是一个抽象概念。C++中vector 是一个模板,模板分为类模板和函数模板。 模板本身并不是类和函数,编译器根据模板“实例化”出函数和类。 很明显,我们需要给vector添加一些信息,才能让编译器知道,具体要实例化出什么样的类或者函数。
以vector为例

vector<int> ivec;  //ivec保存int类型的对象,这个“容器”名是ivec,“容器”里装着int类型的对象。
vector<vector<int>> file;// file中元素是vector对象。

Note: vector 是模板而非类型,有vector生成的类型必须包含vector中元素的类型,vector< int > ivec。引用不是对象,不存在包含引用的vector。

定义和初始化vector对象

操作说明
vector< T > v1v1是一个空的vector,潜在元素是T类型,默认初始化
vector< T > v2(v1)v2是v1的副本
vector< T > v2=v1v2是v1的副本
vector< T > v3(n,val)v2包含n个重复元素,初始值为val
vector< T> V4(10)v4包含了10个重复执行初始化的对象,10是容量
vector< T > v5={a,b,c…}包含元素个数和初始化值

Note: 圆括号和花括号有区别


vector <int> v1(10);//构造对象v1,v1的容量为10
vector<int> v1{10};// 列表初始化,10是v1中的一个值。
vector<int> v2(10,2);//10个元素,值为2
vector<int> v2{10,2};//值10和值2

向vector对象中添加值

一般做法:创建一个空的vector对象,在运行的时候再动态添加元素

//把0到99的元素添加到v中,push_back函数,负责把一个元素当成vector对象的尾元素压到对象的尾端。
vector<int> v;
	for (int i = 0; i < 100; i++)
	{
		v.push_back(i);
	}
//实时读入数据然后赋予vector对象
string word;
	vector<string> text;
	while (cin >> word)
	{
		text.push_back(word);
	}

vector的其他操作

操作说明
v.empty()如果v不含有任何元素,返回true否则返回false
v.size()返回v中元素个数,类型是 vector< T >::size_type
v.push_back(t)把t添加到尾端
v[n]返回v中第n个元素的引用
==,!=,<,>,<=,>=如果两个对象容量相等,元素值一致,则相等,元素值一致,容量小的小,元素有区别,按第一队相异元素比较结果。

不能用下标给vector对象添加元素

vector<int> s;//空vector对象
	for (vector<int>::size_type i = 0; i < 10; i++)
	{
		s[i]=i;
	}
	for (auto c : s)
	{
		cout << c << endl;
	}
	//这个程序vs2022没报错,但是运行起来会中止,有点坑
	//正确的做法
	for (vector<int>::size_type i = 0; i < 10; i++)
	{
		s.push_back(i);
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值