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;
}

STL--向量(vector),布布扣,bubuko.com

时间: 2024-10-24 20:45:11

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

学习STL -- 向量vector

在STL中向量vector是使用数组的形式实现的,因此向量具有顺序表的所有特点,可以快速随机存取任意元素.向量是同一种数据类型的对象的集合,每个对象根据其位置有一个整数索引值与其对应,类似于数组.与定义数组不同,向量在实例化是不需要声明长度,标准库负责管理和储存元素相关的内存,不用担心长度不够. vector容器中的元素是连续存放的,当容器中增加一个新元素的时候,如果原来的存储空间刚好被用完,那么系统需要重新申请一块更大的连续存储空间,把原来的元素复制到新的空间,并在最后添加新元素,最后再撤销久

【C++】STL,vector容器操作

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化vector< typeName > v1;       //默认v1为

STL之vector使用详解

Vector成员函数 函数 表述 c.assign(beg,end)c.assign(n,elem) 将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range. c.back() 传回最后一个数据,不检查这个数据是否存在. c.begin() 传回迭代器重的可一个数据. c.capacity() 返回容器中数据个数. c.clear() 移除容器中所有数据. c.empty() 判断容器

C++向量(Vector)

向量Vector: 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器. 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版.在使用它时, 需要包含头文件#include<vector> 向量的声明: vector<int> a ; //声明一个int型向量avector<int> a(10) ; //声明一个初

【STL】vector的insert方法详解

#include<vector> #include<iostream> using namespace std; int main() { vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; v.insert(v.begin(),8);//在最前面插入新元素. v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素 v.insert(v.end(),3);//在向量末尾追加新元素. vector<int

STL容器 vector,list,deque 性能比较

C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差别并不是很大,但是当数据达到一定数量后,会明显感觉性能上有很大差异. 本文就试图从介绍,以及性能比较两个方面来讨论这个问题. vector - 会自动增长的数组 list - 擅长插入删除的链表 deque - 拥有vector和list两者优点的双端队列 性能竞技场 性能总结与使用建议 测试程序清

标准模板库中的向量(vector)

//C++数据结构与算法(第4版) Adam Drozdek 著  徐丹  吴伟敏<<清华大学出版社>> 向量是最简单的STL容器,其数据结构与数组类似,占据着一个连续的内存块.由于内存位置是连续的,所以向量中的元素可以随机访问,访问向量中任何一个元素的时间也是固定的.存储空间的管理是自动的,当要将一个元素插入到已满的向量中时,会为向量分配一个更大的内存块,将向量中的元素复制进新的内存块,然后释放旧的内存块.所以,向量是一个灵活的数组,是能够动态改变自身大小的数组. vector(

向量 vector

#include <iostream> #include <vector> #include <algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int n,i; cin>>n; vector<int> a(n); for(i=0;i<n;i++) { cin>>a[i]; } sort(a.begin(),

STL之vector

今天学习了STL 以前用的c,可是比赛回来发现c有点弱,c++的stl是比较实用的,适合比赛.所以学习了一下. vector. 这是一个容器,其实就是线性表. 使用之前在头部加上#include <vector> 然后就可以使用 vector<type> vec; //type is a kind of basic type (eg. int double ..) 然后访问这个表的时候需要声明一个变量 vector<type>::iterator ite; 然后就可以用

C++ STL:vector

  不定长数组:vetor 它就像一个二维数组,只是第一维的大小是固定的,但是第二维的大小不固定. 下面是一些尝试代码: 1. <pre name="code" class="cpp"> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<vec