C++ vector的详细用法

vector容器类型   vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。vector的构造

函数原型:template<typename T>   explicit vector();                                 // 默认构造函数,vector对象为空   explicit vector(size_type n, const T& v = T());    // 创建有n个元素的vector对象   vector(const vector& x);   vector(const_iterator first, const_iterator last);

注:vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。

举例:vector<string> v1;         // 创建空容器,其对象类型为string类vector<string> v2(10);     // 创建有10个具有初始值(即空串)的string类对象的容器vector<string> v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容器vector<string> v4(v3.begin(), v3.end());  // v4是与v3相同的容器(完全复制)

vector的操作(下面的函数都是成员函数)

bool empty() const;                    // 如果为容器为空,返回true;否则返回falsesize_type max_size() const;            // 返回容器能容纳的最大元素个数size_type size() const;                // 返回容器中元素个数  size_type capacity() const;            // 容器能够存储的元素个数,有:capacity() >= size()  void reserve(size_type n);             // 确保capacity() >= nvoid resize(size_type n, T x = T());   // 确保返回后,有:size() == n;如果之前size()<n,那么用元素x的值补全。

reference front();                     // 返回容器中第一个元素的引用(容器必须非空)const_reference front() const;                   reference back();                      // 返回容器中最后一个元素的引用(容器必须非空)const_reference back() const;

reference operator[](size_type pos);   // 返回下标为pos的元素的引用(下标从0开始;如果下标不正确,则属于未定义行为。const_reference operator[](size_type pos) const; reference at(size_type pos);           // 返回下标为pos的元素的引用;如果下标不正确,则抛出异常out_of_rangeconst_reference at(size_type pos) const;

void push_back(const T& x);            // 向容器末尾添加一个元素          void pop_back();                       // 弹出容器中最后一个元素(容器必须非空)

// 注:下面的插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效iterator insert(iterator it, const T& x = T());        // 在插入点元素之前插入元素(或者说在插入点插入元素)void insert(iterator it, size_type n, const T& x);     // 注意迭代器可能不再有效(可能重新分配空间)void insert(iterator it, const_iterator first, const_iterator last);

iterator erase(iterator it);           // 删除指定元素,并返回删除元素后一个元素的位置(如果无元素,返回end())iterator erase(iterator first, iterator last); // 注意:删除元素后,删除点之后的元素对应的迭代器不再有效。

void clear() const;                    // 清空容器,相当于调用erase( begin(), end())

void assign(size_type n, const T& x = T());   // 赋值,用指定元素序列替换容器内所有元素void assign(const_iterator first, const_iterator last);

const_iterator begin() const;          // 迭代序列iterator begin();const_iterator end() const;iterator end();

const_reverse_iterator rbegin() const;reverse_iterator rbegin();const_reverse_iterator rend() const; reverse_iterator rend();

vector对象的比较(非成员函数)

   针对vector对象的比较有六个比较运算符:operator==、operator!=、operator<、operator<=、operator>、operator>=。

   其中,对于operator==和operator!=,如果vector对象拥有相同的元素个数,并且对应位置的元素全部相等,则两个vector对象相等;否则不等。   对于operator<、operator<=、operator>、operator>=,采用字典排序策略比较。

注:其实只需要实现operator==和operator!=就可以了,其它可以根据这两个实现。因为,operator!= (lhs, rhs) 就是 !(lhs == rhs),operator<=(lhs, rhs) 就是 !(rhs < lhs),operator>(lhs, rhs) 就是 (rhs < lhs),operator>=(lhs, rhs) 就是 !(lhs, rhs)。

vector类的迭代器

   vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算:it + n、it - n、it2 - it1。注意it2 - it1返回值为difference_type(signed类型)。

   注意,任何改变容器大小的操作都可能造成以前的迭代器失效。

应用示例

#include <iostream>#include <cassert>#include <vector>

using namespace std;

int main(){    vector<string> v(5, "hello");    vector<string> v2(v.begin(), v.end());

    assert(v == v2);

    cout<<"> Before operation"<<endl;    for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it)        cout<<*it<<endl;

    v.insert(v.begin() + 3, 4, "hello, world");    cout<<"> After insert"<<endl;    for(vector<string>::size_type i = 0; i < v.size(); ++i)        cout<<v[i]<<endl;

    vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6);    assert(*it == "hello, world");    cout<<"> After erase"<<endl;    for(vector<string>::size_type i = 0; i != v.size(); ++i)        cout<<v[i]<<endl;

    assert(v.begin() + v.size() == v.end());    assert(v.end() - v.size() == v.begin());    assert(v.begin() - v.end() == -vector<string>::difference_type(v.size()));

    return 0;}程序说明:上面程序中用了三个循环输出容器中的元素,每个循环的遍历方式是不一样的。特别需要说明的是,第二个循环在条件判断中使用了size() 函数,而不是在循环之前先保存在变量中再使用。之所以这样做,有两个原因:其一,如果将来在修改程序时,在循环中修改了容器元素个数,这个循环仍然能很好 地工作,而如果先保存size()函数值就不正确了;其二,由于这些小函数(其实现只需要一条返回语句)基本上都被声明为inline,所以不需要考虑效率问题。在网上找的 还有很多 建议你还是买一本stl看看里面有更详细的内容 而且比较基础
时间: 2024-11-05 12:35:16

C++ vector的详细用法的相关文章

java.util.vector中的vector的详细用法

ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创建.向Vector中添加元素.从Vector中删除元素. * 统计Vector中元素的个数和遍历Vector中的元素. */ public class VectorDemo{ public static void main(String[] args){ //Vector的创建 //使用Vector

Display:Block 详细用法

根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为"block",成为"块级"元素(block-level):而span元素的默认display属性值为"inline",称为"行内"元素. 块级元素: 动占据一定矩形空间,可以通过设置高度.宽度.内外边距等属性,来调整的这个矩形的样子: 行内元素: 自己的

DOM Style样式对象的详细用法

DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head>     <style type="text/css">                /* 内部样式 */       h3 {color:green;}     </style>             <!-- 外部样式 style.css -->    

【转】 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

文件/目录权限设置命令chmod的详细用法

chmod是文件/目录权限设置的命令,在Linux中经常遇到,本博文以下总结chmod的详细用法. Linux/Unix的档案调用权限分为三级,即档案拥有者user.群组group.其他other.u表示该档案的拥有者,g表示与该档案的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是. + 表示增加权限.- 表示取消权限.= 表示唯一设定权限. r表示可读取,w表示可写入,x表示可执行. 举例说明: (1).将档案file1.txt 设为所有人皆可读取: chmod u

mysql中游标在存储过程中的详细用法

昨天写的一个东东,分享下给大家. drop PROCEDURE  if exists sp_cleanUserData; CREATE  PROCEDURE `sp_cleanUserData`() BEGIN /*定义游标*/ declare v_dt bigint(20) default 0 ; declare v_num INT DEFAULT 0; /*游标循环到末尾时给定义的常量赋值*/ declare cur_userId   CURSOR FOR select  userId fr

Linux中find、grep命令详细用法

在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 find命令的常用选项及实例 find与xargs grep命令 grep命令的一般形式 grep正则表达式元字符集(基本集) grep命令的常用选项及实例 1.find命令 find命令是一个无处不在命令,是linux中最有用的命令之一.find命令用于:在一个目录(及子目录)中搜索文件,你可以

SplitContainer 控件详细用法(转)

1.可以将 Windows 窗体 SplitContainer 控件看作是一个复合体,它是由一个可移动的拆分条分隔的两个面板.当鼠标指针悬停在该拆分条上时,指针将相应地改变形状以显示该拆分条是可移动的.使用 SplitContainer 控件,可以创建复合的用户界面(通常,在一个面板中的选择决定了在另一个面板中显示哪些对象).这种排列对于显示和浏览信息非常有用.拥有两个面板使您可以聚合不同区域中的信息,并且用户可以轻松地使用拆分条(也称为"拆分器")调整面板的大小.另外,还可以嵌套多个

chmod和chown命令详细用法

Linux下数字表示文件的操作权限(777,755,..) Linux下,查看某路径下用(ls -l)查看所有文件的详细属性列表时,会看到文件的操作权限,类似"drwxr-xr-x"的字符串. 这串字符可以分成4段理解,结构为"d + 文件所有者操作权限 + 文件所有者所在组操作权限 + 其余人的操作权限": 1,第一段:例子中字母"d",表示文件所在目录 2,第二段:例子中字符串"rwx",表示文件所有者对此文件的操作权限