电子商务网站建设概述,安徽华力建设集团网站,电白网站建设,北京海淀国税局网站Vector介绍C Vector#xff08;向量容器#xff09; 是一个线性顺序结构。相当于数组#xff0c;但其大小可以不预先指定#xff0c;并且自动扩展。它可以像数组一样被操作#xff0c;由于它的特性我们完全可以将vector 看作动态数组。 在创建一个vector 后#xff0c;它… Vector介绍C Vector向量容器 是一个线性顺序结构。相当于数组但其大小可以不预先指定并且自动扩展。它可以像数组一样被操作由于它的特性我们完全可以将vector 看作动态数组。 在创建一个vector 后它会自动在内存中分配一块连续的内存空间进行数据存储初始的空间大小可以预先指定也可以由vector 默认指定这个大小即capacity 函数的返回值。当存储的数据超过分配的空间时vector 会重新分配一块内存块但这样的分配是很耗时的在重新分配空间时它会做这样的动作 首先vector 会申请一块更大的内存块 然后将原来的数据拷贝到新的内存块中 其次销毁掉原内存块中的对象调用对象的析构函数 最后将原来的内存空间释放掉。 如果vector 保存的数据量很大时这样的操作一定会导致糟糕的性能这也是vector 被设计成比较容易拷贝的值类型的原因。所以说vector 不是在什么情况下性能都好只有在预先知道它大小的情况下vector 的性能才是最优的。 vector 的特点 (1) 指定一块如同数组一样的连续存储但空间可以动态扩展。即它可以像数组一样操作并且可以进行动态操作。通常体现在push_back() pop_back() 。 (2) 随机访问方便它像数组一样被访问即支持[ ] 操作符和vector.at() (3) 节省空间因为它是连续存储在存储数据的区域都是没有被浪费的但是要明确一点vector 大多情况下并不是满存的在未存储的区域实际是浪费的。 (4) 在内部进行插入、删除操作效率非常低这样的操作基本上是被禁止的。Vector 被设计成只能在后端进行追加和删除操作其原因是vector内部的实现是按照顺序表的原理。 (5) 只能在vector 的最后进行push 和pop 不能在vector 的头进行push 和pop 。 (6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放这个操作非常消耗性能。 所以要vector 达到最优的性能最好在创建vector 时就指定其空间大小。 Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。 1.Constructors 构造函数 vectorint v1; //构造一个空的vector vectorint v1( 5, 42 ); //构造了一个包含5个值为42的元素的Vector 2.Operators 对vector进行赋值或比较 C Vectors能够使用标准运算符: , !, , , , 和 . 要访问vector中的某特定位置的元素可以使用 [] 操作符. 两个vectors被认为是相等的,如果: 1.它们具有相同的容量 2.所有相同位置的元素相等. vectors之间大小的比较是按照词典规则. 3.assign() 对Vector中的元素赋值 语法 void assign( input_iterator start, input_iterator end ); // 将区间[start, end)的元素赋到当前vector void assign( size_type num, const TYPE val ); // 赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容。 4.at() 返回指定位置的元素 语法 TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全; 5.back() 返回最末一个元素 6.begin() 返回第一个元素的迭代器 7.capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下 8.clear() 清空所有元素 9.empty() 判断Vector是否为空返回true时为空 10.end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置) 11.erase() 删除指定元素 语法 iterator erase( iterator loc );//删除loc处的元素 iterator erase( iterator start, iterator end );//删除start和end之间的元素 12.front() 返回第一个元素的引用 13.get_allocator() 返回vector的内存分配器 14.insert() 插入元素到Vector中 语法 iterator insert( iterator loc, const TYPE val ); //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, void insert( iterator loc, size_type num, const TYPE val ); //在指定位置loc前插入num个值为val的元素 void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入区间[start, end)的所有元素 15.max_size() 返回Vector所能容纳元素的最大数量上限 16.pop_back() 移除最后一个元素 17.push_back() 在Vector最后添加一个元素 18.rbegin() 返回Vector尾部的逆迭代器 19.rend() 返回Vector起始的逆迭代器 20.reserve() 设置Vector最小的元素容纳数量 //为当前vector预留至少共容纳size个元素的空间 21.resize() 改变Vector元素数量的大小 语法: void resize( size_type size, TYPE val ); //改变当前vector的大小为size,且对新创建的元素赋值val 22.size() 返回Vector元素数量的大小 23.swap() 交换两个Vector 语法 void swap( vector from ); Vector用法 1.声明 一个vector类似于一个动态的一维数组。 vectorint a; //声明一个元素为int类型的vector a vectotMyType a; //声明一个元素为MyType类型的vector a 这里的声明的a包含0个元素既a.size()的值为0但它是动态的其大小会随着数据的插入和删除改变而改变。 vectorint a(100, 0); //这里声明的是一个已经存放了100个0的整数vector 你可以用以下的几种方法声明一个 vector 对象 vectorfloat v(5, 3.25); //初始化有5 个元素其值都是3.25 vectorfloat v_new1(v); vectorfloat v_new2 v; vectorfloat v_new3(v.begin(), v.end()); 这四个vector 对象是相等的可以用operator来判断。 2.向量操作 常用函数 size_t size(); // 返回vector的大小即包含的元素个数 void pop_back(); // 删除vector末尾的元素vector大小相应减一 void push_back(); //用于在vector的末尾添加元素 T back(); // 返回vector末尾的元素 void clear(); // 将vector清空vector大小变为0 其他访问方式 couta[5]endl; couta.at(5)endl; 以上区别在于后者在访问越界时会抛出异常而前者不会。 3.遍历 (1). for(vectordatatype::iterator ita.begin(); it!a.end();it) cout*itendl; (2). for(int i0;ia.size;i) couta[i]endl; 现在想得到容器中能保存的最大元素数量就可以用 vector 类的成员函数max_size() vectorshape::size_type max_size my_shapes.max_size(); 当前容器的实际尺寸 --- 已有的元素个数用size() vectorshape::size_type size my_shapes.size(); 就像size_type 描述了vector 尺寸的类型value_type 说明了其中保存的对象的类型 cout “value type: “ typeid(vectorfloat::value_type).name(); 输出 value type: float 可以用capacity()来取得vector 中已分配内存的元素个数 vectorint v; vectorint::size_type capacity v.capacity(); vector 类似于数组可以使用下标[]访问 vectorint v(10); v[0] 101; 注意到这里预先给10 个元素分配了空间。你也可以使用vector 提供的插入函数来动态的扩 展容器。成员函数push_back()就在vector 的尾部添加了一个元素 v.push_back(3); 也可以用insert()函数完成同样的工作 v.insert(v.end(), 3); 这里insert()成员函数需要两个参数一个指向容器中指定位置的迭代器(iterator)一个待插 入的元素。insert()将元素插入到迭代器指定元素之前。 现在对迭代器(Iterator)做点解释。Iterator 是指针(pointer)的泛化iterator 要求定义 operator*它返回指定类型的值。Iterator 常常和容器联系在一起。例子 vectorint v(3); v[0] 5; v[1] 2; v[2] 7; vectorint::iterator first v.begin(); vectorint::iterator last v.end(); while (first ! last) cout *first “ “; 上面代码的输出是 5 2 7 begin()返回的是vector 中第一个元素的iterator而end()返回的并不是最后一个元素的 iterator而是past the last element。在STL 中叫past-the-end iterator。 组合查找 vectorint::iterator result find( v.begin( ), v.end( ), 2 ); //查找2 if ( result v.end( ) ) //没找到 cout No endl; else //找到 cout Yes endl;