STL--向量(vector)

STL的组成

标准模板库STL关注的重点是泛型数据结构和算法,其关键组成部分是容器(containers)、算法(algorithms)、迭代器(iterators)、函数对象(Function Object)、适配(Adaptor)。

 

本文地址:http://www.cnblogs.com/archimedes/p/Cpp-STL-Vector.html,转载请注明源地址。

 

容器(containers):容器是数据在内存中组织的方法,例如,数组、堆栈、队列、链表或二叉树(不过这些都不是STL标准容器)。
STL 中的容器是一种存储T (Template)类型值的有限集合的数据结构,
容器的内部实现一般是类。这些值可以是对象本身,如果数据类型T代表的是Class的话。

 

算法(algorithms):算法是应用在容器上以各种方法处理其内容的行为或功能。例如,有对容器内容排序、复制、检索和合并的算法。在
STL中,算法是由模板函数表现的。这些函数不是容器类的成员函数。相反,它们是独立的函数。它们不仅可以将其用于STL容器,而且可以用于普通的C++
数组或任何其他应用程序指定的容器。

 

迭代器(iterators)
:一旦选定一种容器类型和数据行为(算法),那么剩下唯一要他做的就是用迭代器使其相互作用。可以把迭代器看作一个指向容器中元素的普通指针。可以如递增
一个指针那样递增迭代器,使其依次指向容器中每一个后继的元素。迭代器是STL 的一个关键部分,因为它将算法和容器连在一起。

 

函数对象(Function Object):定义了函数调用操作符(operator())的类

 

适配器(adaptor):封装一个部件以提供另外的接口(例如用list实现stack)

 

容器的分类:

  • 序列式容器(Sequence containers)
  • 每个元素都有固定位置--取决于插入时机和地点,和元素值无关。
  • vector(向量)、deque(双端队列)、list(表)
  • 关联式容器(Associated containers)
  • 元素位置取决于特定的排序准则,和插入顺序无关
  • set(集合)、multiset(多重集合)、
  • pmap(映射)、multimap(多重映射)

向量(vector)

向量(vector 容器类):#include <vector> ,vector 是一个能够存放任意类型的动态数组,是基本数组的类模板。其内部定义了很多基本操作。

内部实现: 数组

vector <T, Alloc>

可以随机存取数据(用索引直接存取)。

向量尾部添加或删除数据,耗时O(1)。但是在中部或头部插入或删除数据需要移动后面数据,耗时O(N)。

vector 类中定义了4 中种构造函数:

  • 默认构造函数,构造一个初始长度为0 的空向量,如: vector<int> v1 ;
  • 带有单个整形参数的构造函数,此参数描述了向量的初始大小。这个构造函数还有一个可选的参数,这是一个类型为T的实例,描述了这个向量中各成员的初始值;如: vector<int> v2(n,0); 如果预先定义了 n, 他的成员值都被初始化为0;
  • 复制构造函数,构造一个新的向量,作为已存在的向量的完全复制,如: vector<int> v3(v2) ;
  • 带两个常量参数的构造函数,产生初始值为一个区间的向量。区间由一个半开区间 [ first,last ) 来指定。如: vector<int> v4(first,last)

举例:

#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
int ar[10] = {  12, 45, 234, 64, 12, 35, 63, 23, 12, 55  };
char* str = "Hello World";
int main()
{
    vector <int> vec1(ar, ar + 10); // first=ar,last=ar+10, 不包括ar+10
    vector < char > vec2(str, str + strlen(str)); // first=str,last= str+strlen(str)
    cout << "vec1:" << endl;
    // 打印vec1 和vec2 ,const_iterator 是迭代器,后面会讲到
    // 当然,也可以用for (int i=0; i<vec1.size(); i++)cout << vec[i]; 输出
    //size() 是vector 的一个成员函数
    for (vector<int>::const_iterator p = vec1.begin();p != vec1.end(); ++p)
        cout << *p;
    cout << '\n' << "vec2:" << endl;
    for (vector< char >::const_iterator p1 = vec2.begin();p1 != vec2.end(); ++p1)
        cout << *p1;
    cout << '\n';
    return 0;
}

vector操作:

头文件   #include<vector>

定义变量  vector<int> myvec;

主要成员函数

  • myvec.clear()              移除容器中所有数据。
  • myvec.push_back(elem)        在尾部加入一个数据elem。
  • myvec.pop_back()  删除最后一个数据。
  • myvec.size()         返回容器中实际数据的个数,类型为size_type。
  • myvec.erase(pos)        删除pos位置的数据,返回下一个数据的位置。
  • myvec.insert(pos,cnt,elem)  在pos位置插入cnt个数据elem。
  • myvec.begin()       返回的指针指向数组中的第一个数据。
  • myvec.end()          实际上是取末尾加一,以便让循环正确运行--它返回的指针指向最靠近数组界限的数据。
  • myvec.empty()          判断容器是否为空。
  • operator[]                  返回容器中指定位置的一个引用

vector举例:

#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> INTVECTOR;// 自定义类型INTVECTOR
int main() { // 测试vector 容器的功能
    INTVECTOR vec1;//vec1 对象初始为空
    INTVECTOR vec2(10, 6);//vec2 对象最初有10 个值为6 的元素
    INTVECTOR vec3(vec2.begin(), vec2.begin() + 3);//vec3 对象最初有3 个值为6 的元素,拷贝构造
    INTVECTOR::iterator i;// 声明一个名为i 的双向迭代器
    cout << "vec1.begin()--vec1.end():" << endl;// 从前向后显示vec1 中的数据
    for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " ";    cout << endl;
    cout << "vec2.begin()--vec2.end():" << endl;// 从前向后显示vec2 中的数据
    for (i = vec2.begin(); i != vec2.end(); ++i) cout << *i << " ";    cout << endl;
    cout << "vec3.begin()--vec3.end():" << endl;// 从前向后显示vec3 中的数据
    for (i = vec3.begin(); i != vec3.end(); ++i)  cout << *i << " ";     cout << endl;
    // 测试添加和插入成员函数,vector 不支持从前插入
    vec1.push_back(2); // 从后面添加一个成员
    vec1.push_back(4);
    vec1.insert(vec1.begin() + 1, 5);// 在vec1 第一个的位置上插入成员5
    vec1.insert(vec1.begin() + 1, vec3.begin(), vec3.end());// 从vec1 第一的位置开始插入vec3 的所有成员
    cout << "after push() and insert() now the vec1 is:" << endl;
    for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " ";
    cout << endl;
// 测试赋值成员函数
    vec2.assign(8, 1);  // 重新给vec2 赋值,8 个成员的初始值都为1
    cout << "vec2.assign(8,1):" << endl;
    for (i = vec2.begin(); i != vec2.end(); ++i)
        cout << *i << " ";
    cout << endl;
    // 测试引用类函数
    cout << "vec1.front()=" << vec1.front() << endl;// vec1 第零个成员
    cout << "vec1.back()=" << vec1.back() << endl;// vec1 的最后一个成员
    cout << "vec1.at(4)=" << vec1.at(4) << endl;// vec1 的第五个成员
    cout << "vec1[4]=" << vec1[4] << endl;
    // 测试移出和删除
    vec1.pop_back();// 将最后一个成员移出vec1
    vec1.erase(vec1.begin() + 1, vec1.end() - 2);// 删除成员
    cout << "vec1.pop_back() and vec1.erase():" << endl;
    for (i = vec1.begin(); i != vec1.end(); ++i)
        cout << *i << " ";
    cout << endl;
    // 显示序列的状态信息
    cout << "vec1.size(): " << vec1.size() << endl;// 打印成员个数
    cout << "vec1.empty(): " << vec1.empty() << endl;// 清空
    return 0;
}
时间: 2024-08-03 14:35:50

STL--向量(vector)的相关文章

C++ STL中用vector 改进内存的再分配

本文描述的是一种很常见的情况:当你在某个缓存中存储数据时,常常需要在运行时调整 该缓存的大小,以便能容纳更多的数据.本文将讨论如何使用 STL 的 vector 进行内存的再 分配. 这里描述的是一种很常见的情况:当你在某个缓存中存储数据时,常常需要在 运行时调整该缓存的大小,以便能容纳更多的数据.传统的内存再分配技术非常繁琐,而且 容易出错:在 C 语言中,一般都是每次在需要扩充缓存的时候调用 realloc().在 C++ 中 情况更糟,你甚至无法在函数中为 new 操作分配的数组重新申请内

c++-简单重写stl里vector的构造函数

问题描述 简单重写stl里vector的构造函数 #include#include#includeusing namespace std; templateclass Vector{private: int size; T* list;public: Vector(int sz); Vector(int sz T t(int s)); ~Vector(){ delete[] list; } T& operator ;}; //构造函数templateVector::Vector(int sz){

C++ 6.0字节数组使用stl或者vector怎么实现过滤和添加浮点数呢?

问题描述 C++ 6.0字节数组使用stl或者vector怎么实现过滤和添加浮点数呢? C++ 6.0字节数组使用stl或者vector怎么实现过滤和添加浮点数呢? 解决方案 vector<float> vec; vec.push_back(浮点数); ... 解决方案二: 用stl中的filter来过滤 解决方案三: 你描述的有问题...

详解Java编程中向量(Vector)的应用_java

Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一种类似于"动态数组"的功能,向量与数组的重要区别之一就是向量的容量是可变的. 可以在向量的任意位置插入不同类型的对象,无需考虑对象的类型,也无需考虑向量的容量. 向量和数组分别适用于不同的场合,一般来说,下列场合更适合于使用向量: 如果需要频繁进行对象的插入和删除工作,或者因为需要处理的对

关于STL中vector容器的一些总结_C 语言

1.vector的简单介绍 vector作为STL提供的标准容器之一,是经常要使用的,有很重要的地位,并且使用起来也是灰常方便.vector又被称为向量,vector可以形象的描述为长度可以动态改变的数组,功能和数组较为相似.实际上更专业的描述为:vector是一个多功能的,能够操作多种数据结构和算法的模板类和函数库,vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.(注:STL的容器从实现的

java对象群体的组织:向量Vector

向量的功能: 1.能存储任意对象 2.不能存储基本类型的数据,如39,除非将这些数据包裹在包裹类中 3.其容量可以按需求自动扩充 4.若果不用扩充容量,增加元素方法的效率较高 方式: Vector myVector=new Vector() //初始容量为10 Vector myVector=new Vector(int cap) // 初始容量为cap Vector myVector=new Vector(Collection col) //使用集合col的元素初始化,若果col为数组,需要先

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器)   STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等   2.容器与算法 案例如下: #incl

STL之vector

一. vector概述     1. vector的数据安排以及操作方式与数组非常的相似.数组是静态空间,一旦配置了就无法改变其大小.但是vector是动态的,随着元素的加入它的内部机制会自动扩充空间以容纳新元素,所以不用担心vector的空间问题.     2. vector的内部实现机制:定义一个vector的时候,如果不指定大小默认会开辟一块大小为n(n是默认值)的空间,如果指定大小就会为其开辟相应大小的空间.当vector的空间容纳了所有的元素之后,这个时候系统会为vector开辟一个当

STL - 容器 - vector简单应用

VectorTest.cpp #include <vector> #include <iostream> #include <string> #include <algorithm> #include <iterator> #include "VectorTest.h" using namespace std; void VectorTest::simpleOperation() { // create empty vecto

STL学习系列之四:STL学习小结

提供了类型安全.高效而易用特性的STL无疑是最值得C++程序员骄傲的部分.每一个C++程序员都应该好好学习STL:). STL(Standard Template Library 标准模板库)是C++标准库的一个重要组成部分,它由Stepanov and Lee等人最先开发,它是与C++几乎同时开始开发的:一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++,一个原因了,C++中已经有了模板.在后来,STL又被添加进了C++库.1996年,惠普公司又免费公开了STL,为