外贸网站建设公司效果,酷乐家居在线设计,吉林营销网站建设开发,网站开发技术联系方式本篇我们来介绍STL的vector的内容。vector其实就是顺序表#xff0c;vector的学习还是分为接口使用和模拟实现两大部分#xff0c;本片就是介绍一下vector的使用。 1.vector的介绍及使用
vector文档介绍#xff1a;vector - C Reference 在使用时需要加头文件#include vector的学习还是分为接口使用和模拟实现两大部分本片就是介绍一下vector的使用。 1.vector的介绍及使用
vector文档介绍vector - C Reference 在使用时需要加头文件#include vector.
vector是一个标准的模板。不知道什么是模板去看【C】模板初识函数模板、类模板-CSDN博客 第一个模板参数是要存的数据类型第二个模板参数是一个空间配置器就是一个内存池现在不用关心他是什么。
我们在vector学习时一定要学会查文档。 string因为一些发展历史的原因设计的接口比较多比较冗余vector相对来说就好很多接口比string少很多。我们还是重点说经常使用的接口。 2.vector的构造函数、析构函数和operator
构造函数 比如说下面的存int类型的顺序表。
vectorint v1; //无参构造
vectorint v2(10, 1); //10个1初始化
vectorint v3(v2.begin(), v2.end());//迭代器区间初始化
vectorint v4(v2.begin(), --v2.end());//迭代器区间初始化 析构函数自动调用。 赋值运算符重载。 vectorint v1; //无参构造
vectorint v2(10, 1); //10个1初始化
vectorint v3(v2.begin(), v2.end());//迭代器区间初始化
vectorint v4(v2.begin(), --v2.end());//迭代器区间初始化
v4 v2; //v2,v4已存在是赋值 3.vector的遍历
vector的遍历和string一样有三种方式下标遍历、迭代器、范围for。这三种遍历详细的介绍在string类里面【C】string类接口使用万字详解_sting怎么用-CSDN博客 第2.5节string类对象的访问及遍历操作不管是string还是vector迭代器和范围for的用法都是一样的类域不同而已如果不清楚的建议先看string的2.5节。
3.1 下标遍历
vectorint v2(10, 1); //10个1初始化
for (int i 0; i v2.size(); i)
{cout v2[i] ;
}
cout endl;
因为vector也重载了operator[]所以也可以通过下标遍历。 3.2 迭代器 vectorint v2(10, 1); //10个1初始化
vectorint::iterator it v2.begin();
while (it ! v2.end())
{cout *it ;it;
}
cout endl;
这里vector的迭代器要指定vector::类域我们说string的迭代器的时候也是指定了string::类域。 反向迭代器和const迭代器就不演示了。 3.3 范围for
vectorint v2(10, 1); //10个1初始化
for (auto e : v2)
{cout e ;
}
cout endl; 4.reserve
这个部分别的接口就不多说了看一眼就知道是什么。我们来说一下reserve扩容。 用法大家都知道我们看一下扩容机制是不是一直按1.5倍扩。
void TestVectorExpandOP()
{vectorint v;size_t sz v.capacity();cout making bar grow:\n;for (int i 0; i 100; i){v.push_back(i);if (sz ! v.capacity()){sz v.capacity();cout capacity changed: sz \n;}}
}
int main()
{TestVectorExpandOP();return 0;
}
大概是1.5倍有的地方做了特殊处理比如向上取整向下取整。
解决办法就是提前开空间提前就开100个。
void TestVectorExpandOP()
{vectorint v;size_t sz v.capacity();v.reserve(100); // 提前将容量设置好可以避免一遍插入一遍扩容cout making bar grow:\n;for (int i 0; i 100; i){v.push_back(i);if (sz ! v.capacity()){sz v.capacity();cout capacity changed: sz \n;}}
} 同样的我们传n过去编译器会开大于等于n的空间。
但是对于下面的第二种情况string和vector处理方式不同。 5.resize
reserve是绝对不会改变size的只会对capacity产生影响但是resize会改变size还会改变capacity。 第二个参数val传的话多出来的所有都存为val。直接代码演示。
vectorint v(10, 1);//10个1初始化
v.resize(5); //nsize情况 vectorint v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//size n capacity,不传第二个参
v.resize(15); vectorint v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//size n capacity,传第二个参
v.resize(15, 2); vectorint v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//n capacity,不传第二个参
v.resize(23); vectorint v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//n capacity,传第二个参
v.resize(23, 2); resize大概就是这样。 6.insert和erase 尾插和尾删就不多说了这里说一下insert。 vector的insert不支持下标了都是迭代器。
vectorint v(10, 1);
v.insert(v.begin(), 2);//头插
v.insert(v.end(), 3);//尾插 vectorint v(10, 1);
v.insert(v.begin(), 2);//头插
v.insert(v.end(), 3);//尾插
v.insert(v.begin() 3, 4);//第3个位置插入 erase也不支持下标只支持迭代器。 vectorint v(10, 1);
v.insert(v.begin(), 2);//头插
v.insert(v.end(), 3);//尾插
v.insert(v.begin() 3, 4);//第3个位置插入
v.erase(v.begin());//删第2个位置数据 7.vector支持流插入和流提取吗
不支持。我们会发现vector文档里面并没有重载和因为vector的输入输出有很多不确定性。
这个要注意一下。 别的接口就不多说了很多和string接口用法一致。所以一定要打好string的基础vector学起来就比较轻松。【C】string类接口使用万字详解_sting怎么用-CSDN博客