C++第六讲:STL--vector的使用及模拟实现
- 1.vector简介
- 2.vector的常见接口介绍
- 3.vector在OJ题中的使用
- 4.vector的模拟实现
1.vector简介
vertor是一个真正的容器,底层实现是一个动态开辟的数组:
所以说我们可以将vector简单地理解成:
vector的一些接口的使用和string相同,所以对于那些简单的使用,就一笔带过,本文详细要讲的还是vertor的模拟实现,以及一些其它的科普知识
2.vector的常见接口介绍
尽管不会详细讲述接口的作用,但是还是会讲接口一一列出来
2.1constructor – 构造
构造的使用:
int main()
{
vector<int> first;//使用vector模板实例化一个对象
vector<int> second(4, 100);//4个数据,每个数据为100
vector<int> third(second.begin(), second.end());//迭代器区间初始化
vector<int> forth(second);//拷贝初始化
return 0;
}
这些都是一些简单的构造,要着重处理的是:
使用initializer_list进行初始化:
int main()
{
vector<int> v = {
10, 20, 30, 40 };//使用数组进行初始化
vector<int> v1({
20, 30, 40 });//和上面的功能是一样的
//使用数组初始化的底层其实是遍历数组,将数组中的元素一个一个地尾插到vector中
//auto il1 = { 1, 2, 3, 4, 5, 6 };
//initializer_list<int> il2 = { 1, 2, 3, 4, 5, 6 };//等价于上面的auto
//int a[] = { 1, 2, 3, 4, 5, 6 };
return 0;
}
2.2destructor – 析构
2.3begin、end
迭代器,使用起来也十分简单:
int main()
{
vector<int> v({
1, 2, 3, 4, 5, 6, 7, 8, 9 });
//这表明迭代器的范围应该在vector<int>中,这样就可以更加清楚地理解迭代器了
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;//1 2 3 4 5 6 7 8 9
return 0;
}
既然有了迭代器,那么就可以使用范围for:
int main()
{
vector<int> v({
1, 2, 3, 4, 5, 6, 7, 8, 9 });
for (auto e : v)
{
cout << e << " ";
}
cout << endl;//1 2 3 4 5 6 7 8 9
return 0;
}
2.3.1vector和string的区别、vector
下面还有一种使用范围for时需要注意的地方:
int main()
{
//看下面两个有什么区别:
vector<char> v;
string s1;
//1.vector中没有关于字符串的概念,只有尾插和尾删,所以并不能直接插入一个字符串,而string中能
//2.vector中并没有对于字符串特有的操作,比如连接、查找子串、替换子串等
//3.vector中不仅能存储字符数据,还能够针对于其它任何类型的数据,而string是专门处理字符的类
return 0;
}
int main()
{
//但是我们可以这样写:
vector<string> v;
//这样就可以使用针对字符串的操作了:
string s1 = "张三";
v.push_back(s1);
v.push_back("李四");
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
v[0] += 'x';//这里使用的是string中的+=,因为v[0]就是一个string类的对象
v[0] += "apple";
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
//v[0][0]++;//张 -》 峙
//C++中,对于汉字的编码,是通过汉字的后一个字节来将相同读音的汉字排在一起的
v[0][1]++;//张 -》 掌
v[0][1]++;//掌 -》 涨
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
但是这里会出现问题: