C++知识点4——vector与string简述

string

使用string类必须包含头文件#include<string>

 

string对象的初始化

1.默认初始化

string s1;

 

2.拷贝初始化

string s4=s1;
string s5="qwer";

 

3.直接初始化

string s3("qwer"); 
string s5="qwer"; 
string s6(10,'c');

 

上述代码的运行结果

void stringinit()
{
	string s1;
	string s2(s1);
	string s3("qwer");
	string s4=s1;
	string s5="qwer";
	string s6(10,'c');
	cout<<s1<<","<<s2<<","
	<<s3<<","<<s4<<","<<s5
	<<","<<s6<<endl;
}

从上述结果可以看出,如果等号右边的值或者括号内的值相同,那么拷贝初始化和直接初始化是没有区别的

但实际上,二者调用的函数不同,拷贝初始化调用的是拷贝构造函数,而直接初始化调用的是对应的构造函数

string对象如果执行默认初始化(事实上调用的是无参构造函数),那么对象的默认值是空串

 

string  size函数的返回值

string的size函数返回的是string::size_type,并不是int,string::size_type是一个无符号的数据类型,可以存储下任何大小的string对象

 

string对象与字符串字面值

string对象(如string tmp="qwer";)与字符串字面值(如"qwer")看起来相似,但是类型完全不同。因为C++中的字符串字面值不存在加法运算,所以无法对两个字符串字面值进行相加操作(下面代码中第二个res5)

string类将operator+运算符函数定义为非成员函数,而该函数的参数的类型是const string &,又因为const变量的引用可以绑定常量,也可以绑定string对象,所以 string对象可以与字符串字面值相加,也可以与string对象相加。

所以,下面代码中res1等价于operator+("abc", tmp);res2等价于operator+(tmp,"abc")。res3等价于operator+(operator+(res1,","), res2),res4同理

void stringandlitreal()
{	
    string tmp="qwer";
	string res1="abc"+tmp;
	string res2=tmp+"abc";
	string res3=res1+", "+res2;
	string res4=res3+"qwer"+"abc";
	string res5="qwer"+res3+"abc";
	string res5="abc"+"qwer";//加上这句代码,编译无法通过
}

 

vector

vector类似C语言中的数组,是C++标准库中的模板类,使用vector时,需要包含头文件 #include<vector>

 

vector的初始化(以int为例)

1.默认初始化

vector<int> v;

 

2.列表初始化

vector<int> v2={1,2,3,4}; 
vector<int> v3{1,2,3,4};

 

3.拷贝初始化

vector<int> v4=v2;

 

4.直接初始化

vector<int> v5(v2); 
vector<int> v6(10,1);

 

5.用数组初始化vector,也是直接初始化的一种

int a[5]={1,2,3}; 
vector<int> v9(a, a+sizeof(a)/sizeof(int));

 

代码

void vectorinit()
{
	vector<int> v1;//默认初始化,无任何元素
	vector<int> v2={1,2,3,4};
	vector<int> v3{1,2,3,4};
	vector<int> v4=v2;
	vector<int> v5(v2);
	vector<int> v6(10,1);//初始化十个元素,每个都是1
	vector<int> v7(10);//初始化10个元素,都是0
	
	cout<< v1.size()<<endl;

	for (vector<int>::size_type i=0;i<v6.size();++i) {
		cout<<v6[i];
	}
	for (vector<int>::size_type i=0;i<v7.size();++i) {
		cout<<v7[i];
	}

	int *p=&v2[0];
	int &r=v2[0];
	vector<int *> v8(10, p);//可以定义指针的vector
	//vector<int &> v9(10,r);//不能定义引用的vector
	int a[5]={1,2,3};
	vector<int> v9(a, a+sizeof(a)/sizeof(int));
	for (std::vector<int>::size_type i=0;i<v9.size();++i) {
		cout<<v9[i]<<endl;
	}
}

运行结果

默认初始化的vector无任何元素,vector<int> v6(10,1)调用构造函数初始化10个元素,每个元素都是1,vector<int> v7(10)调用构造函数初始化10个元素,都是0。

因为vector中存储的是变量或对象,而引用只是个别名,不是对象,所以不能定义引用的vector

也可以向vector对象传入数组的任意两个元素的地址,用来初始化vector

 

vector中存储string与列表初始化

void stringinvector()
{
	vector<string> v1{10, "hi"};//等价于vector<string> v1(10, "hi")
	vector<string> v3{10};//等价于vector<string> v3(10)
	vector<string> v4{"hi"};
	cout<<v1.size()<<","<<v3.size()<<","<<v4.size()<<endl;

	for (vector<string>::size_type i=0;i<v1.size();++i) {
		cout<<v1[i];
	}
	cout<<endl;

	for (vector<string>::size_type i=0;i<v3.size();++i) {
		cout<<v3[i];
	}
	cout<<endl;

	for (vector<string>::size_type i=0;i<v4.size();++i) {
		cout<<v4[i];
	}
}

代码的执行结果显示v1的大小为10,元素都是hi,v3的大小为10,元素都是空串,v4的大小为1,元素是hi

当使用列表初始化的方法初始化存储string的vector时,vector<string> v1{10, "hi"}的初始化结果和vector<string> v1(10, "hi")相同,vector<string> v3{10}的初始化结果和vector<string> v3(10)相同

 

vector元素的添加和访问

当向vector中添加元素时,可以使用函数push_back(),该方法将元素添加到vector的尾部,如果想要访问vector中的某个元素,可以使用下表访问,类似于数组,也可以使用迭代器

 

string,char数组,char指针

可以用char数组或者char指针初始化string,但是反之不行

void stringandchar()
{
	char chararray[10]={'a','b',97};
	string str=chararray;
      //char chararray1[10]=str;
	cout<<str<<str.size()<<endl;
}

上述代码用char数组初始化string,反之则不可以

 

如果想用string对象初始化char指针,需要调用string对象的c_str()函数,c_str的返回值是const char *,需要将左值用const修饰,否则会报错

正确做法如下:

void stringandchar()
{
	char chararray[10]={'a','b',97};
	string str=chararray;
	//char chararray1[10]=str.c_str();
	cout<<str<<str.size()<<endl;
	const char *charp=str.c_str();
	cout<<charp<<endl;
}

 

参考:

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值