宁波专业制作网站,海口建网站公司,wpf可以应用于网站开发吗,交流建设网站vector 一.vector的介绍二.vector的使用1.vector 构造函数2.vector 空间增长3.vector 增删查改4.vector 迭代器的使用1.正向迭代器2.反向迭代器 5.victor 迭代器失效问题#xff08;重点#xff09; 三.vector不支持 流提取与流插入四.vector存储自定义类型1.存储string2.存储… vector 一.vector的介绍二.vector的使用1.vector 构造函数2.vector 空间增长3.vector 增删查改4.vector 迭代器的使用1.正向迭代器2.反向迭代器 5.victor 迭代器失效问题重点 三.vector不支持 流提取与流插入四.vector存储自定义类型1.存储string2.存储vector模拟二维数组 五.vector——OJ题 一.vector的介绍 vector是C标准模板库STL中的一个序列容器。它能够存储相同类型的元素序列并且这些元素在内存中连续存储。vector可以存储一个动态数组即它可以在运行时改变其大小以存储任意类型的对象包括内置类型如int、double等以及用户自定义的类型如类对象。vector提供了许多方便的成员函数来管理其存储的元素比如添加、删除、访问元素等动态顺序表。
vector关键特性
动态数组vector的大小不是固定的它可以根据需要自动增长或缩小。当向vector中添加元素而现有空间不足时它会重新分配一块更大的内存空间并将旧数据复制到新位置然后释放旧空间。随机访问由于vector中的元素在内存中连续存储因此可以通过索引下标直接访问任何位置的元素这提供了与静态数组相似的随机访问性能。自动内存管理vector负责其内部元素的内存分配和释放程序员无需手动管理内存。迭代器vector提供了迭代器iterator允许以通用方式遍历容器中的元素。容量和大小vector有两个重要的属性size()和capacity()。size()返回容器中当前元素的数量而capacity()返回容器当前分配的存储空间能够容纳的元素数量。
使用STL的三个境界能用明理能扩展 。
二.vector的使用 学习vector时查看文档是非常重要的vector的文档介绍vector在实际中非常的重要在实际中我们熟悉常见的接口就可以下面列出了哪些接口是要重点掌握的。
1.vector 构造函数
(construct)构造函数声明接口说明vector()重点无参构造vectorsize_type n, const value_type val value_type()构造并初始化n个val无val默认为T()例如整形为0vector (const vector x)重点拷贝构造vector (InputIterator first, InputIterator last)使用迭代器区间进行初始化构造
注意vector使用模板template class T 其中将T重定义为value_type。
int main()
{vectorint v1; //无参构造vectorint v2(10, 1); //有参构造用10个1初始化v2vectorint v3(v2); //拷贝构造vectorint v4(v2.begin(), v2.end()); //迭代器区间初始化vectorint v5(v2.begin() 3, v2.end() - 2);//遍历vector的三中方式//1.下标[]for (int i 0; i v5.size(); i){cout v5[i] ; //打印5个1}cout endl;//2.迭代器vectorint::iterator it v5.begin();while (it ! v5.end()){cout *it ;it;}cout endl;//3.范围forfor (auto e : v5){cout e ;}cout endl;return 0;
}2.vector 空间增长
容量空间接口说明size获取数据个数capacity获取容量大小empty判断是否为空resize重点改变vector的sizereserve重点改变vector的capacityshrink_to_fit缩容直到适合size capacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。这个问题经常会考察不要固化的认为vector增容都是2倍具体增长多少是根据具体的需求定义的。vs是PJ版本STLg是SGI版本STL。 reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。 resize在开空间的同时还会进行初始化影响size。
// 如果已经确定vector中要存储元素大概个数可以提前将空间设置足够就可以避免边插入边扩容导致效率低下的问题了
int main()
{size_t sz;vectorint v;sz v.capacity();//v.reserve(100); 提前将容量设置好可以避免一遍插入一遍扩容cout making v 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;}}return 0;
}int main()
{//reserve()提前开好空间大于容量——扩容、小于容量——不会缩容啥事不干vectorint v(10, 1);cout v.size() endl; //10cout v.capacity() endl; //10v.reserve(20);cout v.size() endl; //10cout v.capacity() endl; //20v.reserve(15);cout v.size() endl; //10cout v.capacity() endl; //20v.reserve(5);cout v.size() endl; //10cout v.capacity() endl; //20return 0;
}int main()
{//resize()修改size并且可以初始化vectorint v(10, 1);v.reserve(20);cout v.size() endl; //10cout v.capacity() endl; //20v.resize(15, 2);cout v.size() endl; //15cout v.capacity() endl; //20v.resize(25, 3);cout v.size() endl; //25cout v.capacity() endl; //30v.resize(5);cout v.size() endl; //5cout v.capacity() endl; //30return 0;
}3.vector 增删查改
vector增删查改接口说明operator[]重点像数组一样访问越界断言at像数组一样访问越界抛异常push_back重点尾插pop_back重点尾删front返回第一个数据的引用back返回最后一个数据的引用assign赋值支持个数赋值、迭代器赋值不常用insert在position之前插入val只支持迭代器erase删除position位置的数据只支持迭代器swap交换两个vectorclear清空size但是capacity保持不变find查找注意这个是算法模块实现不是vector的成员接口
注意InputIterator find (InputIterator first, InputIterator last, const T val);返回迭代器。
int main()
{vectorint v1(10, 1);cout v1[0] endl; //1cout v1.at(0) endl; //1v1.push_back(100); //尾插100v1.pop_back(); //尾删cout v1.front() endl; //返回第一个数据cout v1.back() endl; //返回最后一个数据vectorint v2;v2.assign(10, 5); //赋值10个5v2.assign(v1.begin(), v1.end()); //迭代器赋值v2.assign(v1.begin() 3, v1.end() - 2);v2.insert(v2.begin(), 20); //头插20v2.insert(v2.begin() 3, 20); //在第三个位置下标为3插入20v2.erase(v2.begin() 3); //删除第三个位置下标为3的值v1.swap(v2); //交换v1与v2v1.clear(); //清空数据但是容量不会改变return 0;
}4.vector 迭代器的使用
iterator的使用接口说明begin end重点获取第一个数据位置的iterator/const_iterator 获取最后一个数据的下一个位置的iterator/const_iteratorrbegin rend获取最后一个数据位置的reverse_iterator/const_reverse_iterator获取第一个数据前一个位置的reverse_iterator/const_reverse_iterator
1.正向迭代器 int main()
{//普通正向迭代器vectorint v1(10, 1);vectorint::iterator it v1.begin();while (it ! v1.end()){//(*it); 可以修改cout *it ;it;}cout endl;//const修饰正向迭代器const vectorint v2(10, 1);vectorint::const_iterator cit v2.begin();while (cit ! v2.end()){//(*cit); 不可以修改cout *cit ;cit;}cout endl;return 0;
}2.反向迭代器 int main()
{//普通反向迭代器vectorint v1(10, 1);vectorint::reverse_iterator rit v1.rbegin();while (rit ! v1.rend()){//(*rit); 可以修改cout *rit ;rit;}cout endl;//const修饰反向迭代器const vectorint v2(10, 1);vectorint::const_reverse_iterator crit v2.rbegin();while (crit ! v2.rend()){//(*crit); 不可以修改cout *crit ;crit;}cout endl;return 0;
}5.victor 迭代器失效问题重点 迭代器的主要作用就是让算法能够不用关心底层数据结构其底层实际就是一个指针或者是对指针进行了封装。比如vector的迭代器就是原生态指针T* 。因此迭代器失效实际就是迭代器底层对应指针所指向的空间被销毁了而使用一块已经被释放的空间造成的后果是程序崩溃(即如果继续使用已经失效的迭代器程序可能会崩溃)。
会引起其底层空间改变的操作都有可能是迭代器失效比如resize、reserve、insert、assign、push_back等。
int main()
{vectorint v{ 1,2,3,4,5,6 };auto it v.begin();// 将有效元素个数增加到100个多出的位置使用8填充操作期间底层会扩容// v.resize(100, 8);// reserve的作用就是改变扩容大小但不改变有效元素个数操作期间可能会引起底层容量改变// v.reserve(100);// 插入元素期间可能会引起扩容而导致原空间被释放// v.insert(v.begin(), 0);// v.push_back(8);// 给vector重新赋值可能会引起底层容量改变v.assign(100, 8);/*出错原因以上操作都有可能会导致vector扩容也就是说vector底层原理旧空间被释放掉而在打印时it还使用的是释放之间的旧空间在对it迭代器操作时实际操作的是一块已经被释放的空间而引起代码运行时崩溃。解决方式在以上操作完成之后如果想要继续通过迭代器操作vector中的元素只需给it重新赋值即可。*/while (it ! v.end()){cout *it ;it;}cout endl;return 0;
}指定位置元素的删除操作-erase。 erase删除pos位置元素后pos位置之后的元素会往前搬移没有导致底层空间的改变理论上讲迭代器不应该会失效但是如果pos刚好是最后一个元素删完之后pos刚好是end的位置而end位置是没有元素的那么pos就失效了。因此删除vector中任意位置上元素时vs就认为该位置迭代器失效了。
三.vector不支持 流提取与流插入
int main()
{vectorint v1(10, 0);//模拟流提取从键盘提取值for (size_t i 0; i v1.size(); i){cin v1[i];}//模拟流插入往屏幕输出值for (auto e : v1){cout e ;}cout endl;return 0;
}四.vector存储自定义类型
1.存储string
int main()
{//vector存储stringvectorstring v1;string s(hello world);v1.push_back(s);v1.push_back(hello xzy); //隐式类型转换for (const auto e : v1) //减少拷贝构造提高效率{cout e endl;}cout endl;return 0;
}2.存储vector模拟二维数组
传统开辟二维数组 int main()
{int** p (int**)malloc(sizeof(int*) * 3);for (int i 0; i 3; i){p[i] (int*)malloc(sizeof(int) * 3);}for (int i 0; i 3; i){free(p[i]);p[i] NULL;}free(p);p NULL;return 0;
}vector模拟二维数组
templateclass T
class vector
{
public:T operator[](int i){return _a[i];}
private:T* _a;size_t size;size_t capacity;
};
int main()
{//利用vector模拟实现10 * 5 的二维数组vectorint v(5, 1);vectorvectorint vv(10, v);vv[2][1] 100;//vv.operator[](2).operator[](1) 100;for (int i 0; i 10; i){for (int j 0; j 5; j){cout vv[i][j] ;}cout endl;}return 0;
}五.vector——OJ题
杨辉三角只出现一次的数字只出现一次的数字||只出现一次的数字|||删除有序数组中的重复项