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》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
13万+

被折叠的 条评论
为什么被折叠?



