C++中vector容器

使用C++中vector容器时必须包含

#include <vector>
using namespace std;

vector基本概念

vector:向量(动态数组),内存分配原理与string相同,是连续的空间,空间不够用时,申请一个更大的空间,迭代器失效
功能:vector数据结构和数组非常相似,也称为单端数组
vector与普通数组区别:数组是静态空间,vector可以动态扩展

vector构造函数

功能:创建vector容器
①vector<T> v;
采用模板实现类实现,默认构造函数
②vector(v.begin(),v.end());
将v[begin(),end()]区间中的元素拷贝给自身
③vector(n,elem);
构造函数将n个elem拷贝给自身
④vector(const vector &v);
拷贝构造函数
举例:

#include<iostream>
#include<vector>       //包含头文件
using namespace std;

void printVector(vector<int> &v){        //打印容器的统一接口
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }  
    cout<<endl;
}

void test(){
    vector<int> v1;       //无参构造函数,即默认构造
    for(int i=0;i<10;i++){           //给容器v1赋值
        v1.push_back(i);             
    }
    printVector(v1);        //调用打印函数

    vector<int> v2(v1.begin(),v1.end());    //通过区间方式进行构造
    printVector(v2);

    vector<int> v3(5, 20);      //构造函数将n个elem拷贝给自身
    printVector(v3); 

    vector<int> v4(v3);               //拷贝构造
    printVector(v4);   
}

int main(){
    test();
    system("pause");
}

输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
20 20 20 20 20
20 20 20 20 20

vector赋值操作

功能:给vector容器进行赋值
①vector& operator=(const vector &v);
重载=操作符
②assign(begin,end);
将[begin,end)区间中的数据拷贝赋值给本身
③assign(n,elem);
将n个elem拷贝赋值给本身
举例:

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

void printVector(vector<int> &v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int> v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    //赋值
    vector<int> v2;    
    v2 = v1;                 //重载=操作符
    printVector(v2);

    vector<int> v3;
    v3.assign(v1.begin(), v1.end());    //将[begin, end)区间中的数据拷贝赋值给本身
    printVector(v3);

    vector<int> v4;
    v4.assign(5, 20);      //将n个elem拷贝赋值给本身
    printVector(v4);
}

int main() {
    test();
    system("pause");
}

输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
20 20 20 20 20

vector容量和大小

功能:对vector容器的容量和大小进行操作
①empty();
判断容器是否为空,返回值为0,不为空,否则为空
②capacity();
容器的容量,初始容量:定义对象时,初始化几个容量就是几,无参就是0
Visual Studio容量不够时,增加现有容量的一半(向下取整)
VC6.0容量不够时,增加现有容量的一倍
③size();
返回容器中元素的个数
④resize(int num);
重新设置容器的长度为num,若容器变长,则以默认值(0)填充新位置;若容器变短,删除末尾超出容器长度的元素
⑤resize(int num,elem);
重新设置容器长度为num,并以elem替换默认以0填充的值
举例:

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

void printVector(vector<int> &v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int> v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    cout << v1.empty() << endl;
    cout << "v1的容量为:" << v1.capacity() << endl;
    cout << "v1的大小为:" << v1.size() << endl;
    v1.resize(15);        //重新设置容器大小,变大的部分以0填充
    printVector(v1);

    vector<int> v2;
    for (int i = 0; i < 8; i++) {
        v2.push_back(i);
    }
    printVector(v2);
    v2.resize(15, 9);       //重新设置容器大小,变大的部分以9填充
    printVector(v2);

    v2.resize(10);           //重新设置容器大小,变小,删除末尾多余元素
    printVector(v2);
}

int main() {
    test();
    system("pause");
}

输出:

0 1 2 3 4 5 6 7 8 9
0                                        //返回0说明容器不为空
v1的容量为:13
v1的大小为:10
0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 9 9 9 9 9 9 9
0 1 2 3 4 5 6 7 9 9

vector插入和删除

插入:
①push_back(i);
尾部插入元素i
②insert(const_iterator pos,i);
在迭代器指向位置pos上插入元素i
③insert(const_iterator pos,int count,i);
在迭代器指向位置pos上插入count个元素i
④insert(const_iterator pos,const_iterator first, const_iterator second);
在迭代器指向位置pos上插入另一个迭代器的从first位置到second位置的元素
删除:
⑤pop_back();
删除最后一个元素
⑥erase(const_iterator pos);
删除迭代器指向的元素
⑦erase(const_iterator start, const_iterator end);
删除迭代器指向的从start位置至end位置之间的元素
⑧clear();
删除容器中所有元素
举例:

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

void printVector(vector<int> &v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int> v1;
    v1.push_back(5);    //在迭代器尾部插入元素
    v1.push_back(6);
    v1.push_back(7);
    printVector(v1);

    v1.insert(v1.begin() + 2, 12);       //在迭代器指向的位置(下标为2)插入元素12
    printVector(v1);

    v1.insert(v1.begin(), 5, 8);            //在迭代器指向位置插入5个8
    printVector(v1);

    vector<int> v2(5, 1);
    v1.insert(v1.begin() + 2, v2.begin(), v2.end());     在迭代器指向位置插入迭代器v2的所有值
    printVector(v1);

    v1.pop_back();         //删除迭代器尾部元素
    printVector(v1);

    v1.erase(v1.begin());       //删除迭代器头部元素
    printVector(v1);

    v1.erase(v1.begin(), v1.begin() + 2);         //删除迭代器首部两个元素
    printVector(v1);

    v1.clear();          //清空迭代器中的元素
    printVector(v1);
}

int main() {
    test();
    system("pause");
}

输出:

5 6 7
5 6 12 7
8 8 8 8 8 5 6 12 7
8 8 1 1 1 1 1 8 8 8 5 6 12 7
8 8 1 1 1 1 1 8 8 8 5 6 12
8 1 1 1 1 1 8 8 8 5 6 12
1 1 1 1 8 8 8 5 6 12

vector数据存取

①operator[i];
返回索引i所指的数据
②at(i);
返回索引i所指的数据
③front();
返回容器中第一个数据元素
④back();
返回容器中最后一个数据元素

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

void test() {
    vector<int> v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < v1.size(); i++) {
        cout << v1.at(i) << " ";
    }
    cout << endl;

    cout << "v1的第一个元素:" << v1.front() << endl;
    cout << "v1的最后一个元素:" << v1.back() << endl;
}

int main() {
    test();
    system("pause");
}

输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
v1的第一个元素:0
v1的最后一个元素:9

vector互换容器

功能:实现两个容器内的元素进行互换
swap(v);
将容器v中元素与当前容器中的元素进行互换

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

void printVector(vector<int> &v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int> v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    cout << "交换前:" << endl;
    printVector(v1);

    vector<int> v2;
    for (int i = 10; i > 0; i--) {
        v2.push_back(i);
    }
    printVector(v2);

    cout << "交换后:" << endl;
    v1.swap(v2);
    printVector(v1);
    printVector(v2);
}

int main() {
    test();
    system("pause");
}

输出:

交换前:
0 1 2 3 4 5 6 7 8 9
10 9 8 7 6 5 4 3 2 1
交换后:
10 9 8 7 6 5 4 3 2 1
0 1 2 3 4 5 6 7 8 9

vector预留空间

reserve(int len);
预留len个元素长度的空间,用以减少vector在动态扩展容量时的扩展次数

vector<int> v;
v.reserve(1000);       //预留1000个元素长度的空间,不用动态扩展,可直接使用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容