招聘网站建设方案模板,做机械设计兼职的网站,wordpress增加网站网页关键词,新开传奇网站发布站三端互通std::vector 是C标准模板库(STL)中的一个非常重要的容器类#xff0c;它提供了一种动态数组的功能。能够存储相同类型的元素序列#xff0c;并且可以自动管理存储空间的大小#xff0c;以适应序列大小变化#xff0c;处理元素集合的时候很灵活 1. vector的定义
构造函数声… std::vector 是C标准模板库(STL)中的一个非常重要的容器类它提供了一种动态数组的功能。能够存储相同类型的元素序列并且可以自动管理存储空间的大小以适应序列大小变化处理元素集合的时候很灵活 1. vector的定义
构造函数声明接口说明vector();无参构造vector( size_t n, const value_type val value_type());构造并初始化n个valvector(const vector x);拷贝构造vector(InputIterator first, InputIterator last);使用迭代器进行初始化构造 代码如下
#includeiostream
#includevector
//using namespace std;
using std::vector;
using namespace std;
int main()
{vectorint v1;for (size_t i 0; i v1.size(); i){cout v1[i] ;}cout endl;vectorint v2(10);vectorint v3(10, 6);for (size_t i 0; i v2.size(); i){cout v2[i] , v3[i] ;}cout endl;vectorint v4(v2);for (size_t i 0; i v4.size(); i){cout v4[i] ;}cout endl;vectorint v5(v3.begin(), v3.begin() 2);for (size_t i 0; i v5.size(); i){cout v5[i] ;}cout endl;
}
其中v1是无参默认构造 v2是利用了缺省值全初始化为0v3是初始化n个 6v4是用v2进行拷贝构造v5则是利用迭代器进行构造
输出结果如下 2. 迭代器iterator的使用
iterator的使用接口说明beginend获取第一个位置数据的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iteratorrbeginrend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator
如下图所示 使用代码如下
#includeiostream
#includevector
//using namespace std;
using namespace std;
int main()
{vectorint v(10,6);v.push_back(1);//vectorint::iterator it v.begin();auto it v.begin();while (it ! v.end()){cout *it ;it;}cout endl;vectorint::reverse_iterator iv v.rbegin();while (iv ! v.rend()){cout *iv ;iv;}cout endl;
}输出结果如下 使用iterator不可以vector::iterator it v.begin(); 因为vector是一个模板类需要指定其存储元素的类型。直接写没指定vector具体类型编译器不知道就会报错(比如可能是vectordouble,vectorint等)。当然也可以直接用auto自动识别。 3. vector空间增长问题
成员函数接口说明size获取数据个数capacity获取容量大小empty判断是否为空resize改变vector的元素个数(size)reserve改变vector的容量(capacity)
(1). size与capacity
用以下代码验证vector动态增长
#includeiostream
#includevector
//using namespace std;
using namespace std;
int main()
{vectorint v;size_t sz v.capacity();cout 容量为 sz endl;cout 元素个数 v.size() endl;for (int i 0; i 100; i){v.push_back(i);if (sz ! v.capacity()){sz v.capacity();cout 当前容量 sz endl;cout 当前元素个数 v.size() endl;}}
}
输出结果为下图 通过上图我们不难发现在vs中运行每次增长1.5倍向上取整
而g下运行每次增长2倍并不是所有的vector增容都是增长1.5倍或2倍的。具体增长是多少是看具体的需求定义的。vs是PJ版本STLg是SGI版本STL。
(2). empty与resize与reserve reserve只负责开辟空间如果确定要用多少空间reserve可以缓解vector增容的代价缺陷问题。只影响capacity(),不影响size() resize在开空间时还会进行初始化会影响capacity()还会影响size() 如以下代码
#includeiostream
#includevector
//using namespace std;
using namespace std;
int main()
{vectorint v1;size_t sz v1.capacity();cout v1容量为 sz endl;cout v1元素个数 v1.size() endl;if(v1.empty()){v1.reserve(100);}for (int i 0; i 100; i){v1.push_back(i);if (sz ! v1.capacity()){sz v1.capacity();cout v1当前容量 sz endl;cout v1当前元素个数 v1.size() endl;}}vectorint v2;cout v2容量为 v2.capacity() endl;cout v2元素个数 v2.size() endl;v2.resize(10);cout v2当前容量为 v2.capacity() endl;cout v2当前元素个数为 v2.size() endl;for (int i 0; i v2.size(); i){cout v2[i] ;}cout endl;vectorint v3;cout v3容量为 v3.capacity() endl;cout v3元素个数 v3.size() endl;v3.resize(10, 3);cout v3当前容量为 v3.capacity() endl;cout v3当前元素个数为 v3.size() endl;for (int i 0; i v3.size(); i){cout v3[i] ;}cout endl;
}
输出结果为下图所示 可以验证我们以上说法
4. vector的增删查改
vector的元素操作接口说明push_back尾插pop_back尾删find查找(算法模块实现不是vector成员接口)insert在position(指定坐标)之前插入valerase删除position(指定坐标)位置的数据swap交换两个vector的数据空间operator[]重载运算符使其能像数组一样访问
//#includeiostream //#includevector using namespace std; //using std::vector; //using namespace std; //int main() //{ // vectorint v1; // for (size_t i 0; i v1.size(); i) // { // cout v1[i] ; // } // cout endl; // vectorint v2(10); // vectorint v3(10, 6); // for (size_t i 0; i v2.size(); i) // { // cout v2[i] , v3[i] ; // } // cout endl; // vectorint v4(v2); // for (size_t i 0; i v4.size(); i) // { // cout v4[i] ; // } // cout endl; // // vectorint v5(v3.begin(), v3.begin() 2); // for (size_t i 0; i v5.size(); i) // { // cout v5[i] ; // } // cout endl; //}
//#includeiostream //#includevector using namespace std; //using namespace std; //int main() //{ // vectorint v(10,6); // v.push_back(1); // //vectorint::iterator it v.begin(); // auto it v.begin(); // while (it ! v.end()) // { // cout *it ; // it; // } // cout endl; // vectorint::reverse_iterator iv v.rbegin(); // while (iv ! v.rend()) // { // cout *iv ; // iv; // } // cout endl; //}
//#includeiostream //#includevector using namespace std; //using namespace std; //int main() //{ // vectorint v; // size_t sz v.capacity(); // cout 容量为 sz endl; // cout 元素个数 v.size() endl; // for (int i 0; i 100; i) // { // v.push_back(i); // if (sz ! v.capacity()) // { // sz v.capacity(); // cout 当前容量 sz endl; // cout 当前元素个数 v.size() endl; // } // } //} #includeiostream #includevector //using namespace std; using namespace std; int main() { vectorint v1; size_t sz v1.capacity(); cout v1容量为 sz endl; cout v1元素个数 v1.size() endl; if(v1.empty()) { v1.reserve(100); } for (int i 0; i 100; i) { v1.push_back(i); if (sz ! v1.capacity()) { sz v1.capacity(); cout v1当前容量 sz endl; cout v1当前元素个数 v1.size() endl; } } vectorint v2; cout v2容量为 v2.capacity() endl; cout v2元素个数 v2.size() endl; v2.resize(10); cout v2当前容量为 v2.capacity() endl; cout v2当前元素个数为 v2.size() endl; for (int i 0; i v2.size(); i) { cout v2[i] ; } cout endl; vectorint v3; cout v3容量为 v3.capacity() endl; cout v3元素个数 v3.size() endl; v3.resize(10, 3); cout v3当前容量为 v3.capacity() endl; cout v3当前元素个数为 v3.size() endl; for (int i 0; i v3.size(); i) { cout v3[i] ; } cout endl; }