一、标准库的vector类型

vector是同一种类型的对象的集合

vector的数据结构很像数组,能非常高效和方便地访问单个元素

vector是一个类模板(class template)

vector不能存放引用。

template <
class Type,
class Allocator = allocator<Type>
>
class vector

要使用vector必须包含相关头文件

#include <vector>

using std::vector;

vector对象的初始化:

vector类定义了好几种构造函数

vector<T>  v1;

//vector保存类型为T的对象。默认构造函数v1为空

vector<T> v2(v1);// v2是v1的一个副本

vector<T> v3(n, i); //v3包含n个值为i的元素

vector<T> v4(n); //v4含有值初始化的元素的n个副本

vector<T> v5(v1.begin(), v1.end());  // iterating through v1

vector常用成员函数:

resize 和 reserve的区别:

void reserve(size_type n);

(1)如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块更大的连续空间,其大小为sizeof(T)*n,然后将容器内所有有效元素全部复制到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器的成员指针。注意:容器的大小(即size())并没有发生改变。

(2)否则,什么也不做。

void resize(size_type n, const T& c = T());

(1)如果n大于容器当前的大小(即size()),则在容器的末尾插入n-size()个初值为c的元素,如果不指定初值,则用元素类型的默认构造函数来初始化(这可能引起内存重分配以及容器容量的扩张)。

(2)如果n小于容器当前的大小,则从容器的末尾删除size()-n 个元素,但不释放元素本身的内存空间,因此容量不变。

(3)否则,什么也不做。

e.g

vector<char> vec;
printf(”%zd %zd\n”, vec.size(), vec.capacity());
vec.resize(1024);
printf(”%zd %zd\n”, vec.size(), vec.capacity());
vec.resize(1300);
printf(”%zd %zd\n”, vec.size(), vec.capacity());

运行结果:
0 0 # 一开始size() 和capacity() 都是0
1024 1024 # resize(1024) 之后size() 和capacity() 都是1024
1300 2048 # resize(稍大) 之后capacity() 翻倍,相当于reserve(2048)

例程1:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
#include <vector>
#include <iostream>
using namespace std;

typedef vector<int> INTVEC;

//void ShowVec(const INTVEC& v)
//{
//  unsigned int i;
//  for (i=0; i<v.size(); i++)
//  {
//      cout<<v[i]<<" ";
//  }
//  cout<<endl;
//}

//void ShowVec(INTVEC& v)
//{
//  INTVEC::iterator it;
//  for (it=v.begin(); it!=v.end(); ++it)
//  {
//      cout<<*it<<" ";
//  }
//
//  cout<<endl;
//}

void ShowVec(const INTVEC &v)
{
    INTVEC::const_iterator it;
    for (it = v.begin(); it != v.end(); ++it) //所有迭代器都重载了!=运算符,但有些没有重载<运算符。
    {
        cout << *it << " ";
    }

cout << endl;
}

int main(void)
{
    INTVEC v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

ShowVec(v);

return 0;
}

例程2:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

typedef vector<int> INTVEC;

void ShowVec(const INTVEC &v)
{
    INTVEC::const_iterator it;
    for (it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << " ";
    }

cout << endl;
}

int main(void)
{
    INTVEC v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);
    //cout<<v.back()<<endl;
    //v.pop_back();

ShowVec(v);

//v.erase(v.begin()+2);
    //v.erase(v.begin(), v.begin()+2);

v.erase(remove(v.begin(), v.end(), 3), v.end());
    ShowVec(v);

return 0;
}

例程3:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

typedef vector<int> INTVEC;

void ShowVec(const INTVEC &v)
{
    INTVEC::const_iterator it;
    for (it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << " ";
    }

cout << endl;
}

int main(void)
{
    INTVEC v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    v.push_back(3);

ShowVec(v);

//v.erase(remove(v.begin(), v.end(), 3), v.end());
    INTVEC::iterator it;
    for (it = v.begin(); it != v.end(); /*++it*/)
    {
        if (*it == 3)
        {
            it = v.erase(it);   // erase返回的是当前删除元素的下一个元素
        }
        else
            ++it;
    }
    ShowVec(v);

return 0;
}

参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范

vector 类简介和例程的更多相关文章

  1. map 类简介和例程

    一.标准库的map类型 使用map得包含map类所在的头文件 template < class Key, class Type, class Traits = less<Key>, ...

  2. string 类简介和例程

    一.标准库string类型 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看 template < class C ...

  3. 转载:C++ vector 类学习笔记

    声明:本文转载自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机 ...

  4. C++ vector类详解

    转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...

  5. Java API —— ArrayList类 & Vector类 & LinkList类

    1.ArrayList类     1)ArrayList类概述         · 底层数据结构是数组,查询快,增删慢         · 线程不安全,效率高     2)ArrayList案例   ...

  6. Java Vector 类

    Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. Vector主要用在事先不知道 ...

  7. java.util.Stack类简介

    Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...

  8. ImageView类简介

    4.8  图片控件 本节将要介绍的是图片控件ImageView,首先对ImageView类进行简单介绍,然后通过一个案例来说明ImageView的用法. 4.8.1  ImageView类简介 Ima ...

  9. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

随机推荐

  1. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

    JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - D ...

  2. TCP/IP协议栈与数据报封装 (802.3 Ethernet 以太网 802.11 WLAN 无线网 )

    http://blog.csdn.net/jnu_simba/article/details/8957242 一.ISO/OSI参考模型 OSI(open system interconnection ...

  3. 关于DSP的GPIO的输入输出设置

    DSP 28335 的 GPIO的输入设置: GPIO的输入设置时,除了将此GPIO设置为输入之外,还需要将此GPIO口的电平拉高 //RXD3 GpioCtrlRegs.GPBMUX2.bit.GP ...

  4. apt-get update 和 upgrade 的区别

    http://blog.csdn.net/duyiwuer2009/article/details/26983267

  5. 【redis】redis五大类 用法 【转载:https://www.cnblogs.com/yanan7890/p/6617305.html】

    转载地址:https://www.cnblogs.com/yanan7890/p/6617305.html

  6. [Android Pro] 有关Broadcast作为内部类时注册的一些问题

    很经常Broadcast都会写成一个Activity或者Service的内部类.这时候的注册和普通有点小区别. 有两种情况 1.假如是再Manifest文件里面静态注册的话,需要注意. ex: < ...

  7. python2 python3编码问题记录

    最近在服务器上跑脚本,linux自带的是python 2.x,中文显示经常有问题,通过下面两篇终于弄懂了. https://www.cnblogs.com/575dsj/p/7112767.html ...

  8. 高性能CSS

    避免使用@import 有两种方式加载样式文件,一种是link元素,另一种是CSS 2.1加入@import.而在外部的CSS文件中使用@import会使得页面在加载时增加额外的延迟.虽然规则允许在样 ...

  9. C#的四个基本技巧

    1.如果可能尽量使用接口来编程 .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类.然而,在这种情况下如果你用.NET支持的接口而不是它的类来编程时,代码会变得更加稳定.可用 ...

  10. eclipse启动tomcat, http://localhost:8080无法访问的解决方案

    问题:: tomcat在eclipse里面能正常启动,但在浏览器中访问http://localhost:8080/不能访问tomcat管理页面,且报404错误.同时其他项目页面也不能访问.访问的时候出 ...