C++ primer 基础学习笔记(三)

(三) string和vector
using声明
using namespace::name; //声明形式,由此可以直接访问命名空间的名字

标准库类型string:表示可变长的字符序列,需要包含头文件。

#include <string>
using std::string 

初始化string对象的方

string s1; // 默认初始化 s1是一个空串
string s2(s1); // s2是s1的副本
string s2 = s1 ; // 等价于s2(s1)
string s3("value") // s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s3 = "value" // 等价于 s3("value")
string s4(n, 'c') // 把s4初始化为由连续的n个字符c组成的串
    ```

**直接初始化(不适用等号)和拷贝初始化(使用等号)**

```c++
string s5 = "hiya" ; //  拷贝初始化
string s6("hiya"); //直接初始化
string s7 = (5, 'c'); // 直接初始化 s7的内容是 ccccc

string temp (5, 'c'); // 直接初始化 temp的内容是 ccccc
string s8 = temp // 将temp拷贝给s8 

string对象上的操作

os<<s  //将s写到输出流os中,返回os
is>>s  //从is中读取字符串献给s,字符串以空白分隔,返回is
getline(is,s) // 从is中读取一行献给s,返回is
s.empty() // s为空返回true,否则返回false
		!line.empty() //empty根据string对象是否为空返回一个对应的bool值
s.size() // 返回s中字符个数
		line.size()>80 //size返回string对象的长度
s[n] //返回字符中第n个字符的引用,位置n从0开始记起
s1+s2 //返回s1和s2连接后结果
	string s1 = "a", s2 = "b" ;
	string s3 = s1 + s2 ;
s1=s2 //用s2的副本代替s1中原来的字符
s1==s2 // 判断s1和s2是否相等 相等则返回一个bool值 true
s1!=s2 // 判断s1和s2 是否不等 不等则返回一个bool值 true

使用getline读取一整行

int main ()
{
	string line;
	while (getline (cin,line))
		if (!line.empty() && line.size()>80) 
			cout<< line <<endl;
		
	return
}

//empty根据string对象是否为空返回一个对应的bool值
//size返回string对象的长度

比较string对象
在这里插入图片描述

为string对象赋值

stringstl(10,'c'),st2;//st1的内容是 ccccocccccc;st2是一个空字符串
stl = st2; //赋值:用st2的副本替换st1的内容 此时stl和st2都是空字符串

两个string对象相加

stringsl="hello,",s2="world\n";
strings3=s1+s2; //s3的内容是hello,world\n
s1+=s2; //等价于s1=s1+s2

字面值和string对象相加

stringsl= "hello", s2="world";//在sl和s2中都没有标点符号
strings3= s1++","+s2+'\'n';

当把string对象和字符字面值及字符串字面值混在一条语句中使用寸,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string

string s4 = s1 + ","; //正确:把一个string对象和一个字面值相加
string s5 = "hello" + ", " //错误:两个运算对象都不是string
strings6=s1+"," + "world" ; //正确:每个加法运算符都有一个运算对象是string
strings7="hello"+ ","+s2; //错误:不能把宇面值直接相加
标准库类型vector:容器

对于类模板来说,我们通过提供一些额外信息来指定模板到底实例化成什么样的类,需要提供哪些信息由模板决定。提供信息的方式总是这样:即在模板名字后面跟一对尖括号,在括号内放上信息。以vector为例,提供的额外信息是vector内所存放对象的类型:

举个🌰:

vector<int>ivec; //ivec保存int类型对象
vector<Sales item> Sales vec; //保存Sales item类型的对象
vector<vector<string>> file;//该向量的元素是vector对象

在上面的例子中,编译器根据模板vector生成了三种不同的类型:vector 、vector<Sales_item>和vector<vector>

定义和初始化vector对象
在这里插入图片描述

可以默认初始化vector对象,从而创建一个指定类型的空vector:

vector<string>svec; //默认初始化,svec不含任何元素

最常见的方式就是先定义一个空vector,然后当运行时获取到元素的值后再逐一添加。
当然也可以在定义vector对象时指定元素的初始值。例如,允许把一个vector对象的元素拷贝给另外一个vector对象。此时,新vector对象的的元素就是原vector对象对应元素的副本。注意两个vector对象的类型必须相同词:

vector<int> ivec;  //初始状态为空
//在此处给ivec添加一些值
vector<int>ivec2(ivec);  //把ivec的元素拷贝给ivec2
vector<int>ivec3 = ivec;  //把ivec的元素拷贝给ivec3
vector<string> svec(ivec2); //错误:svec的元素是string对象,不是int,不是同类型

列表初始化vector对象

vector<string>vl{"a","an", "the"};//列表初始化( 如果提供的是初始元素值的列表,只能把初始值都放在{}里进行列表初始化)
vector<string>v2("a","an","the");//错误

创建指定数量的元素可以用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象:

vector<int>ivec(10,-1);  //10个int类型的元素,每个都被初始化为-1
vector<string>svec(10,"hi!");//10个striing类型的元素,每个都被初始化为"hi!"
vector<int>ivec(10);  //10个元素,每个都初始化为0
vector<string> svec (10);  //10个元素,每个都是空string对象

/*
如果用的是圆括号,可以说提供的值是用来构造(construct)vector对象的。例如,v1的初始值说明了vector对象的容量;v3的两个初始值则分别说明了vector对象的容量和元素的初值。
如果用的是花括号,可以表述成我们想列表初始化(list initialize)该vector对象。也就是说,初始化过程会尽可能地把花括号内的值当成是元初始值的列表来处理,只有在无法执行列表初始化时才会考虑其他初始化方式。在上例中,给v2和v4提供的初始值都能作为元素的值,所以它们都会执行列表初始化,vector对象v2包含一个元素而vector对象v4包含两个元素。
举个🌰:*/

vector<int>vl(10); //vl有10个元素,每个的值都是0
vector<int> v2{10}; //v2有1个元素,该元素的值是10

vector<int>v3(10,1); //v3有10个元素,每个的值都是1
vector<int>v4{10,1}; //v4有2个元素,值分别是10和1

/*-------------------------------------------------*/

vector<string>v5{"hi"};//列表初始化:v5有一个元素
vector<string>v6("hi");//错误:不能使用宇符串宇面值构建vector对象
vector<string> v7{10}; //v7有10个默认初始化的元素
vector<string>v8{10,"hi"}; //v8有10个值为"hi"的元素
/*
花括号里的值必须与元素类型相同。显然不能用int初始化string对象,所以v7和v8提供的值不能作为元素的初始值。
*/

向vector对象中添加元素

先创建一个空vector,然后在运行时再利用vector的成员函数push_back向其中添加元素。push_back负责把一个值当成Vector对象的尾元素"压到(push)“vector对象的"尾端(back)”。

举个🌰:

vector<int>v2; //空vector对象
for(int i=0; i!=100; ++i ) 
		v2.push_back(i);    
		//依次把整数值放到V2尾端,循环结束后v2有100个元素,值从0到99

在上例中,尽管知道vector对象最后会包含100个元素,但在一开始还是把它声明成空vector,在每次迭代时才顺序地把下一个整数作为v2的新元素添加给它。同样的,如果直到运行时才能知道vector对象中元素的确切个数,也应该使用刚刚这种方法创建vector对象并为其赋值。例如,有时需要实时读入数据然后将其赋予vector对象 🌰 :

//从标准输入中读取单词,将其作为vector对象的元素存储
string word;
vector<string> text; //空vector对象
while(cin>>word){
	text.push_back(word); //把word添加到text后面
}

vector上的其他操作

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值