数组长度在初始化时已经定义,访问范围也有限,数组长度还得通过计算
所以C++中定义了很多扩展的“抽象数据类型”,放于“标准库”中
对于数组功能进行扩展的一个标准库类型就是 “容器” vector。vector“容纳”着一堆数据对象,其实就是一组类型相同的数据对象的集合。
除了vector,c++ 11还新增了array模板类,和数组更加类似,长度固定,但更加方便安全,一般在实际应用中固定长度数组使用array,不固定长度数组使用vector。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//默认初始化
vector<int> v1;
//列表初始化(拷贝初始化)
vector<char> v2 = {'a', 'b', 'c', 'd'};
vector<char> v3{'a', 'b', 'c', 'd'};
//直接初始化
vector<short> v4(5); //长度为5,初始化默认为0
vector<long> v5(5, 100); // 长度5,初始化默认为100
//访问元素
cout << v4[2] << endl;
cout << v5[3] << endl;
//修改
v5[3] = 24;
cout << v5[3] << endl;
//对于越界访问,相对于数组更安全,会直接报错
//遍历所有元素
cout << "v5的长度:" << v5.size() << endl;
for(int i = 0; i < v5.size(); i++)
{
cout << v5[i] << "\t";
}
cout << endl;
//相对于数组还有一个功能:可以添加元素
v5.push_back(56);
//或者也可以通过范围循环
for(int num: v5)
{
cout << num <<"\t";
}
cout << endl;
}
同样可以使用 s.size()获取字符串长度。
#include<iostream>
#include<string>
using namespace std;
int main()
{
//初始化
//默认初始化
string s1;
//拷贝初始化
string s2 = "hello world";
string s3 = s2;
//直接初始化
string s4("hello python");
string s5(5, 'h');
cout << s5 << endl;
//访问
cout << s4[1] << endl;
//修改
s4[0] = 'H';
cout << s4 << endl;
//字符串长度
cout << "s4的长度:" << s4.size() << endl;
s4[s4.size() - 1] = 'N';
cout << s4 << endl;
//最好也不要越界访问
//将s4所有字符都转换为大写
for(int i; i < s4.size(); i++)
{
s4[i] = toupper(s4[i]);
}
cout << s4 << endl;
//字符串拼接
string s6("hello");
string s7("my life");
string s8 = s6 + ", " + s7 + "!"; //字符和字符串是不同的,如果此处用的是 ', ',则会报错
cout << s8 << endl;
// string s8 = "hello, " + "my life" 错误,两个字符串字面值常量
// "asasa" 字符串字面值常量的类型并不是string,而是一个char类型的字符数组,所以无法调用string里定义的运算符+,至少要有一个对象是string类型
//因此在拼接时按照左结合率,必须左边是string类型,这是为了和C兼容。
//比较字符串: == != > < >= <=
}