目录
一、什么是vector?
二、容器特性
1.顺序序列
2.动态数组
3.能够感知内存分配器的(Allocator-aware)
三、基本函数实现
1.构造函数
2.修改函数
① assign
② push_back
③ pop_back
④ insert
⑤ erase
⑥ swap
⑦ clear
3.元素访问
① operator[]
② at
③ data
④ front
⑤ back
4.迭代器
① begin
② end
③ rbegin
④ rend
5.容量
① size
② max_size
③ capacity
④ reserve
⑤ resize
四、实例演示
1.一维数组的定义及访问(直接数组访问&迭代器访问)
2.pop_back()&push_back(elem)实例在容器最后移除和插入数据
3.insert()&erase(elem)实例在容器任意位置插入和移除数据
4.clear()清除容器中所有数据
5.排序函数sort()和逆序函数reverse()
6.二维数组的定义
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
容器使用一个内存分配器对象来动态地处理它的存储需求。
vector first;//创建一个值类型为int的空vector
vector second(10);//创建一个10个int的vector,且每个元素初值为0
vector third(10,1);//创建一个10个int的vector,且每个元素初值为1
vector forth(third);//将vector third 拷贝给vector forth ,两者元素值完全相同
vector fifth(third.begin(),third.end()-5);
//将third [third.begin(),third.end()-5)区间的元素赋给fifth
//从数组中获得初值
int b[7]={1,2,3,4,5,6,7};
vector a(b,b+7);
作用:将新内容赋给vector,替换其当前内容,并相应地修改其大小。
std::vector first;
std::vector second;
std::vector third;
first.assign (7,100); // 7 ints with a value of 100
std::vector::iterator it;
it=first.begin()+1;
second.assign (it,first.end()-1); // the 5 central values of first
int myints[] = {1776,7,4};
third.assign (myints,myints+3); // assigning from array.
作用:在vector当前最后一个元素的末尾添加一个新元素。val的内容被复制(或移动)到新元素中。
将容器大小增加了1,当且仅当新vector大小 > 当前vector容量时,会自动重新分配存储空间。
std::vector myvector(5,1);
myvector.push_back (5);
作用:移除vector中的最后一个元素,有效地将容器大小减小1。
std::vector myvector;
int sum (0);
myvector.push_back (100);
myvector.push_back (200);
myvector.push_back (300);
while (!myvector.empty())
{
sum+=myvector.back();
myvector.pop_back();
}
作用:通过在指定位置的元素之前插入新元素来扩展vector,从而通过插入元素的数量有效地增加容器的大小
std::vector myvector (3,100); //100 ,100 ,100
std::vector::iterator it;
it = myvector.begin();
it = myvector.insert ( it , 200 );//200 ,100 100 ,100
myvector.insert (it,2,300); //300,300,200,100,100
it = myvector.begin();
std::vector anothervector (2,400);
myvector.insert (it+2,anothervector.begin(),anothervector.end());
//300,300.400,400,200,100.100
int myarray [] = { 501,502,503 };
myvector.insert (myvector.begin(), myarray, myarray+3);
//501,502,503,300,300.400,400,200,100.100
作用: 从vector对象中移除单个元素(position)或一段元素([first,last))
std::vector myvector;
for (int i=1; i<=10; i++)
{
myvector.push_back(i);
} //1,2,3,4,5,6,7,8,9,10
myvector.erase (myvector.begin()+5);//删除第6个元素
//1,2,3,4,5,7,8,9,10
myvector.erase (myvector.begin(),myvector.begin()+3);//删除前三个元素(左闭右开区间)
//4,5,7,8,9,10
作用:用x的内容交换容器的内容,x是另一个相同类型的vector对象。大小可能不同。
std::vector foo (3,100); // foo={ 100,100,100}
std::vector bar (5,200); // bar={200,200,200,200,200}
foo.swap(bar);
//foo={200,200,200,200,200}
//bar={ 100,100,100}
作用:从vector中移除所有元素(这些元素被销毁),使容器的大小为0。
std::vector myvector;
myvector.push_back (100);
myvector.push_back (200);
myvector.push_back (300); // myvector={100,200,300}
myvector.clear();// myvector={}
myvector.push_back (1101);
myvector.push_back (2202);// myvector={1101,2202}
作用:返回对vector容器中位置n的元素的引用。类似于数组访问
作用:返回对vector中位置n的元素的引用。
【注意】该函数自动检查n是否在vector中有效元素的范围内,如果不在,则抛出out_of_range异常(即,如果n大于或等于其大小)。这与成员操作符[]相反,它不检查边界。
std::vector myvector (10); // myvector={0,0,0,0,0,0,0,0,0,0}
// assign some values:
for (unsigned i=0; i
作用:返回一个直接指针,指向vector内部用来存储其元素的内存数组。
std::vector myvector (5); //myvector={0,0,0,0,0}
int* p = myvector.data();
*p = 10; //myvector={10,0,0,0,0}
++p;
*p = 20; //myvector={10,20,0,0,0}
p[2] = 100; //myvector={10,20,0,100,0}
作用: 返回对vector中第一个元素的引用。
【注意】与返回指向同一元素的迭代器的成员vector::begin不同,此函数返回直接引用。
在空容器上调用此函数会导致未定义行为。
std::vector myvector;
myvector.push_back(78);
myvector.push_back(16);
// now front equals 78, and back 16
myvector.front() -= myvector.back();
作用:返回对vector中最后一个元素的引用。
【注意】与成员vector::end不同,后者返回经过该元素的迭代器,此函数返回直接引用。
在空容器上调用此函数会导致未定义行为。
std::vector myvector;
myvector.push_back(10); //myvector={10}
while (myvector.back() != 0)
{
myvector.push_back ( myvector.back() -1 );
}
//myvector={10,9,8,7,6,5,4,3,2,1,0}
作用:返回一个指向vector中第一个元素的迭代器。
【注意】与返回对第一个元素的引用的成员vector::front不同,这个函数返回一个指向它的随机访问迭代器。
如果容器为空,则返回的迭代器值不能被解引用。
作用:返回指向vector容器中past-the-end 元素的迭代器。
past-the-end 元素是理论元素,在vector的最后一个元素之后。它不指向任何元素,因此不能被解引用。
由于标准库函数使用的范围不包括其关闭迭代器所指向的元素,因此该函数通常与vector::begin结合使用,以指定包含容器中所有元素的范围。
如果容器为空,则返回与vector::begin相同的值。
std::vector myvector;
for (int i=1; i<=5; i++)
{
myvector.push_back(i);
}
for (std::vector::iterator it = myvector.begin() ; it != myvector.end(); ++it)
{
cout<<*it<<",";
}
//myvector={1,2,3,4,5}
作用:返回指向vector中最后一个元素的反向迭代器(即vector的反向起始)。
反向迭代器向后迭代:迭代器增加,会向容器的头移动。
【注意】与vector::back不同,该函数返回一个反向随机访问迭代器。
作用:返回一个反向迭代器,指向vector中第一个元素之前的理论元素(该元素被认为是vector的反向末端)。
vector::rbegin和vector::rend之间的范围包含vector的所有元素(以相反的顺序)。
std::vector myvector (5); // 5 default-constructed ints
int i=0;
std::vector::reverse_iterator rit = myvector.rbegin();
for (; rit!= myvector.rend(); ++rit)
*rit = ++i;
// myvector={5,4,3,2,1}
作用:返回vector中元素的个数。
【注意】vector中保存的实际对象的数量,不一定等于它的存储容量。
std::vector myints;
std::cout << myints.size() << std::endl; //0
for (int i=0; i<10; i++) myints.push_back(i);
std::cout << myints.size() << std::endl; //10
myints.insert (myints.end(),10,100);
std::cout << myints.size() << std::endl; //20
myints.pop_back();
std::cout << myints.size() << std::endl; //19
作用:返回vector所能容纳的最大元素数。
【注意】由于已知的系统或库实现限制,这是容器可以达到的最大潜在大小,但是容器不能保证能够达到这个大小:在达到这个大小之前,它仍然可能无法分配存储。
作用:返回当前为vector分配的存储空间大小(容量),以元素个数表示。
【注意】这个容量不一定等于向量的大小。它可以相等或更大,额外的空间允许容纳增长,而不需要在每次插入时重新分配。这个容量并没有假设向量的大小有限制。当此容量耗尽并且需要更多容量时,容器会自动对其进行扩展(重新分配其存储空间)。vector的大小的理论极限由成员max_size给出。可以通过调用vector::reserve成员显式地改变vector的容量。
std::vector myvector;
// set some content in the vector:
for (int i=0; i<100; i++) myvector.push_back(i);
std::cout << "size: " << myvector.size() << "\n"; //100
std::cout << "capacity: " << myvector.capacity() << "\n"; //128
std::cout << "max_size: " << myvector.max_size() << "\n"; //1073741823
作用:使vector容器容量至少足以容纳n个元素。
【注意】如果n大于当前的vector容量,则该函数使容器重新分配其存储空间,将其容量增加到n(或更大)。在所有其他情况下,函数调用不会导致重新分配,向量容量也不会受到影响。
这个函数对vector的大小没有影响,也不能改变vector的元素。
作用:调整容器的大小,使其包含n个元素。
【注意】
1)如果n小于当前容器的大小,则元素将被减少到前n个元素,并删除超出的元素(并销毁它们)。
2)如果n大于当前容器的大小,则通过在末尾插入所需的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将其进行值初始化。
3)这个函数通过插入或删除元素来改变容器的实际内容。
std::vector myvector;
// set some initial content:
for (int i=1;i<10;i++) myvector.push_back(i);
//myvector={1,2,3,4,5,6,7,8,9}
myvector.resize(5); //myvector={1,2,3,4,5}
myvector.resize(8,100); //myvector={1,2,3,4,5,100,100,100}
myvector.resize(12); //myvector={1,2,3,4,5,100,100,100,0,0,0,0}
⑥ empty
作用:返回vector是否为空(即它的大小是否为0)。
该函数不以任何方式修改容器。要清除vector的内容,请参见vector::clear。
#include
#include
#include
using namespace std;
int main() {
vectorobj1;//创建一个向量存储容器 int
vectorobj2(20,1);//创建一个int型向量容器,最大容量20,初始值为0
for (int i = 0; i < 10; i++) // push_back(elem)在数组最后添加数据
{
obj1.push_back(i+1);
}
//直接数组访问
cout << "数组1:";
for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数
{
cout << obj1[i] << " ";
}
cout << endl;
//迭代器访问
cout << "数组1:";
vector ::iterator it;//声明一个迭代器
for (it = obj1.begin(); it != obj1.end(); it++) {
cout << *it << " ";
}
cout << endl;
vector obj3(obj1);
for (int i = 0; i < 5; i++)//去掉数组最后一个数据
{
obj3.pop_back();
}
cout << "数组3:";
for (int i = 0; i < obj3.size(); i++)//size()容器中实际数据个数
{
cout << obj3[i] << " ";
}
cout << endl;
int a[] = { 1,2,3,4 };
vector obj4(a,a+4);
cout << "数组4:";
for (int i = 0; i < obj4.size(); i++)//size()容器中实际数据个数
{
cout << obj4[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
#include
#include
#include
using namespace std;
int main() {
vectorobj1;//创建一个向量存储容器 int
for (int i = 0; i < 10; i++) // push_back(elem)在数组最后添加数据
{
obj1.push_back(i + 1);
}
cout << "原始数组1:";
for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数
{
cout << obj1[i] << " ";
}
cout << endl;
for (int i = 0; i < 5; i++)//去掉数组最后一个数据
{
obj1.pop_back();
}
cout << "删除后数组1:";
vector ::iterator it;//声明一个迭代器
for (it = obj1.begin(); it != obj1.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
运行结果:
#include
#include
#include
using namespace std;
int main() {
vectorobj1;//创建一个向量存储容器 int
for (int i = 0; i < 10; i++) // push_back(elem)在数组最后添加数据
{
obj1.push_back(i + 1);
}
cout << "原始数组:";
for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数
{
cout << obj1[i] << " ";
}
cout << endl;
obj1.erase(obj1.begin()+1);//删除数组第二个数据
cout << "删除数组第二个数据后:";
vector ::iterator it;//声明一个迭代器
for (it = obj1.begin(); it != obj1.end(); it++) {
cout << *it << " ";
}
cout << endl;
obj1.erase(obj1.begin() + 2, obj1.begin() + 5);//删除数组中第三到第五个数据(左闭右开)
cout << "删除数组中第三到第五个数据后:";
for (it = obj1.begin(); it != obj1.end(); it++) {
cout << *it << " ";
}
cout << endl;
obj1.insert(obj1.end() - 2,0);//倒数第三个位置插入0
cout << "倒数第三个位置插入0后:";
for (it = obj1.begin(); it != obj1.end(); it++) {
cout << *it << " ";
}
return 0;
}
运行结果:
#include
#include
using namespace std;
int main()
{
vectorobj;
for(int i=0;i<10;i++)//push_back(elem)在数组最后添加数据
{
obj.push_back(i);
cout<
运行结果:
#include
#include
#include
using namespace std;
int main() {
vectorobj1;//创建一个向量存储容器 int
obj1.push_back(-2);
obj1.push_back(1);
obj1.push_back(13);
obj1.push_back(23);
obj1.push_back(0);
obj1.push_back(96);
obj1.push_back(11);
cout << "原始数组:";
for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数
{
cout << obj1[i] << " ";
}
cout << endl;
sort(obj1.begin(), obj1.end());//默认为升序排序
cout << "升序排序数组:";
vector ::iterator it;//声明一个迭代器
for (it = obj1.begin(); it != obj1.end(); it++) {
cout << *it << " ";
}
cout << endl;
//逆序方法1
reverse(obj1.begin(), obj1.end());
cout << "逆序数组1:";
for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数
{
cout << obj1[i] << " ";
}
cout << endl;
int obj2[] = { 1,2,3,4,5 };
int len = sizeof(obj2) / sizeof(obj2[0]);
cout << "原始数组2:";
for (int i = 0; i ());
cout << "逆序数组2:";
for (int i = 0; i < len; i++)//size()容器中实际数据个数
{
cout << obj2[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
/*方法一*/
#include
#include
#include
using namespace std;
int main()
{
int N = 5, M = 6;
vector > obj(N); //定义二维动态数组大小5行
for (int i = 0; i < obj.size(); i++)//动态二维数组为5行6列,值全为0
{
obj[i].resize(M);
}
for (int i = 0; i < obj.size(); i++)//输出二维动态数组
{
for (int j = 0; j < obj[i].size(); j++)
{
obj[i][j] = M*i + j+1;
cout << setw(3)<< obj[i][j] << " ";
}
cout << endl;
}
return 0;
}
运行结果:
/*方法二*/
#include
#include
#include
using namespace std;
int main()
{
int N = 5, M = 6;
vector > obj(N,vector(M)); //定义动态二维数组为5行6列,值全为0
for (int i = 0; i < obj.size(); i++)//输出二维动态数组
{
for (int j = 0; j < obj[i].size(); j++)
{
obj[i][j] = M * i + j + 1;
cout << setw(3) << obj[i][j] << " ";
}
cout << endl;
}
return 0;
}
运行结果: