STL之Vector用法

心酸,今天花烧了,39度多,躺在被窝里面也要写程序。听说发烧的时候写代码思路会比较清晰。


正文

  • Vector介绍

screenshot

Vector实际上也是一个数组,但是可以自动扩展,伸缩性比较好。Vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  • Vector的一般接口和用法

为了可以使用vector,必须在你的头文件中包含下面的代码:

#include <vector>

 

vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

using std::vector;
vector<int> vInts;

或者连在一起,使用全名:

std::vector<int> vInts;

建议使用全局的命名域方式:

using namespace std;

 

Vector的一些成员函数:

Vector成员函数

函数 表述
c.assign(beg,end)
c.assign(n,elem)
[beg; end)区间中的数据赋值给c
nelem的拷贝赋值给c
c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range
c.back() 传回最后一个数据,不检查这个数据是否存在。
c.begin() 传回迭代器重的可一个数据。
c.capacity() 返回容器中数据个数。
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.end() 指向迭代器中的最后一个数据地址。
c.erase(pos)
c.erase(beg,end)
删除pos位置的数据,传回下一个数据的位置。
删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() 传回第一个数据。
get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
pos位置插入一个elem拷贝,传回新数据位置。
pos位置插入nelem数据。无返回值。
pos位置插入在[beg,end)区间的数据。无返回值。
c.max_size() 返回容器中最大数据的数量。
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.rbegin() 传回一个逆向队列的第一个数据。
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num) 重新指定队列的长度。
c.reserve() 保留适当的容量。
c.size() 返回容器中实际数据的个数。
c1.swap(c2)
swap(c1,c2)
c1c2元素互换。
同上操作。
vector<Elem> c
vector <Elem> c1(c2)
vector <Elem> c(n)
vector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>()
创建一个空的vector
复制一个vector
创建一个vector,含有n个数据,数据均已缺省构造产生。
创建一个含有nelem拷贝的vector
创建一个以[beg;end)区间的vector
销毁所有数据,释放内存。

Vector操作

函数

描述

operator[] 返回容器中指定位置的一个引用。
  • 创建一个Vector

#include #include

using namespace std;

int main(){ //创建一个int类型 数量为500的vector vector people (500); //创建一个char类型 数量为500 且开始全部初始化为0的vector vector name(500, char(0)); //创建一个char的拷贝 vector nameFromAnother(name); system("pause"); return 0; }

向vector中输入数据

#include #include

using namespace std;

int main(){

//向vector中添加数据
    //vector添加数据的缺省方法是push_back() push_back表示将数据添加到
    //vector的尾部,并且按需要来分配内存
    //例如添加10个数据
for (int i = 0; i < 10; i++){
	people.push_back(int(i));
}
system("pause");
return 0; }

获取vector中指定位置的数据:很多时候我们不必要知道vector里面有多少数据,vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果你想知道vector存放了多少数据,你可以使用empty()。获取vector的大小,可以使用size()。例

int nSize = v.empty()?-1:static_cast(v.size)

访问vector中的数据:

可以使用两种方法来访问vector 1.vector::at() 2.vector::operator[]

operator主要是为了和C语言兼容,他可以像C的数组一样操作,但是at()是进行了边界检查。,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:

分析下面的代码:

vector<int> v;
v.reserve(10);
 for(int i=0; i<7; i++)
    v.push_back(i);
 try{
 int iVal1 = v[7];  // not bounds checked - will not throw
 int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e){
 cout << e.what();
}

我们使用reserve()分配了10个int型的空间,但并不没有初始化。

你可以在这个代码中尝试不同条件,观察它的结果,但是无论何时使用at(),都是正确的。

  • Vector的删除操作

vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当你删除数据的时候,你应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。在考虑删除等操作之前让我们静下来考虑一下在STL中的一些应用。

Remove_if()算法

现在我们考虑操作里面的数据。如果要使用remove_if(),我们需要在头文件中包含如下代码::

#include <algorithm>

Remove_if()有三个参数:

1、 iterator _First:指向第一个数据的迭代指针。

2、 iterator _Last:指向最后一个数据的迭代指针。

3、 predicate _Pred:一个可以对迭代操作的条件函数。

真的太困的,先睡了,明天再写。2015年11月22日22:05:00

Written By:Speak Now




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • What is Mathematics: Solution Chapter 3
  • What is Mathematics: Solution Chapter 2
  • What is Mathematics: Solution Chapter 1
  • A small guide to supplements: What you need to know
  • 混乱与秩序