C++ vector 类

references1
references2

语法

C++ 标准库向量类是序列容器的类模板。 向量以线性排列方式存储给定类型的元素,并允许快速随机访问任何元素。 向量是需要力求保证访问性能时的首选序列容器。向量是一个能够存放任意类型的动态数组

名称说明
assign清除矢量并将指定的元素复制到该空矢量。
at返回对矢量中指定位置的元素的引用。
back返回对向量中最后一个元素的引用。
begin对该向量中第一个元素返回随机访问迭代器。
capacity返回在不分配更多的存储的情况下向量可以包含的元素数。
cbegin返回指向向量中第一个元素的随机访问常量迭代器。
cend返回一个随机访问常量迭代器,它指向刚超过矢量末尾的位置。
crbegin返回一个指向反向矢量中第一个元素的常量迭代器。
crend返回一个指向反向矢量末尾的常量迭代器。
clear清除向量的元素。
data返回指向向量中第一个元素的指针。
emplace将就地构造的元素插入到指定位置的向量中。
emplace_back将一个就地构造的元素添加到向量末尾。
empty测试矢量容器是否为空。
end返回指向矢量末尾的随机访问迭代器。
erase从指定位置删除向量中的一个元素或一系列元素。 erase会改变size,但是不改变capacity
front返回对向量中第一个元素的引用。
get_allocator将对象返回到矢量使用的 allocator 类。
insert将一个元素或多个元素插入到指定位置的向量中。
max_size返回向量的最大长度。
pop_back删除矢量末尾处的元素。
push_back在矢量末尾处添加一个元素。
rbegin返回指向反向向量中第一个元素的迭代器。
rend返回一个指向反向矢量末尾的迭代器。
reserve保留向量对象的最小存储长度。
resize为矢量指定新的大小。
shrink_to_fit放弃额外容量。
size返回向量中的元素数量。
swap交换两个向量的元素。

示例

1.构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
vector<int> a = new vector<int>(10);	//错误的,new返还的是一个指针哦!
vector<int> *a = new vector<int>(10);	//用指针类型变量去接收

vector<int> a(10,1); //定义了10个整型元素的向量,每个元素的初值为1。可以使用a[i]去遍历
vector<int> *a = new vector<int>(10,1);	//用new的话可以使用iterator去遍历,用 * 析址符去读取每个值
	for(auto iter = a->begin(); iter != a->end(); iter++)
        	cout << *iter <<endl;

vector<int> a(b); //用b向量来创建a向量,整体复制性赋值

vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素

int b[7]={1,2,3,4,5,9,8};
	vector<int> a(b,b+7);

2.增加函数

void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin()+1,b.begin()+3,b.begin()+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8         ,插入元素后为1, 4,5,9, 2,3,4

3.删除函数

iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素

a.clear(); //清空a中的元素
a.empty(); //判断a是否为空,空则返回ture,不空则返回false
a.pop_back(); //删除a向量的最后一个元素

a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin() + 3(不包括它)

std::remove() 貌似已经不建议使用了

std::remove() 删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量

remove() 的实现原理是,在遍历容器中的元素时,一旦遇到目标元素,就做上标记,然后继续遍历,直到找到一个非目标元素,即用此元素将最先做标记的位置覆盖掉,同时将此非目标元素所在的位置也做上标记,等待找到新的非目标元素将其覆盖。因此,如果将下面程序中 demo 容器的元素全部输出,得到的结果为 1 4 5 4 3 5。

#include <iostream>
#include "vector"
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    // insert code here...
    vector<int>demo = { 1,3,3,4,3,5 };
    //交换要删除元素和最后一个元素的位置
    auto iter = std::remove(demo.begin(), demo.end(), 3);
    
    cout<< "size: " << demo.size()<<endl;
    cout<< "capacity: " << demo.capacity()<<endl;
    
    for(auto v : demo){	//遍历整个demo
        cout << v << " ";
    }
    cout<< endl;
    
    //输出剩余的元素
    for (auto first = demo.begin(); first < iter;++first) {
        cout << *first << " ";
    }
    
    return 0;
}
size: 6
capacity: 6
1 4 5 4 3 5 
1 4 5

配合erase删除掉无用的元素

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    vector<int>demo{ 1,3,3,4,3,5 };
    //交换要删除元素和最后一个元素的位置
    auto iter = std::remove(demo.begin(), demo.end(), 3);
    demo.erase(iter, demo.end());
    cout << "size is :" << demo.size() << endl;
    cout << "capacity is :" << demo.capacity() << endl;
    //输出剩余的元素
    for (int i = 0; i < demo.size();i++) {
        cout << demo[i] << " ";
    }
    return 0;
}

4.遍历函数

reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

for(auto i : v)遍历容器元素

5.判断函数

bool empty() const:判断向量是否为空,若为空,则向量中无元素

6.大小函数

int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值

7.其他函数

void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
a.assign(4,2); //是a只含4个元素,且每个元素为2

补充: for(auto i : v)遍历容器元素

  1. auto

auto 即 for(auto x: range) 这样会拷贝一份 range 元素,而不会改变 range 中元素;

  1. auto&

当需要修改range中元素,用 for(auto& x: range);

  1. const auto&

当只想读取 range 中元素时,使用 const auto&,如:for(const auto&x:range),它不会进行拷贝,也不会修改range;

  1. const auto

当需要拷贝元素,但不可修改拷贝出来的值时,使用 for(const auto x:range),避免拷贝开销。

/ vector_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> v1, v2, v3;

    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    cout << "v1 = ";
    for (auto& v : v1){
        cout << v << " ";
    }
    cout << endl;

    v2.assign(v1.begin(), v1.end());
    cout << "v2 = ";
    for (auto& v : v2){
        cout << v << " ";
    }
    cout << endl;

    v3.assign(7, 4);
    cout << "v3 = ";
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;

    v3.assign({ 5, 6, 7 });
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;
}
v1 = 10 20 30 40 50 
v2 = 10 20 30 40 50 
v3 = 4 4 4 4 4 4 4 
5 6 7 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值