C++ 16 vector容器

Posted Darren_pty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 16 vector容器相关的知识,希望对你有一定的参考价值。

目录

一、vector容器

1.1 简介

1.2 构造函数

1.3 赋值操作

1.4 容量和大小

1.5 插入删除

1.6 数据存取

1.7 互换容器

1.8 预留空间


一、vector容器

1.1 简介

① vector数据结构和数组非常相似,也称为单端数组。

② vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展。

③ 动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。

④ vector容器的迭代器是支持随机访问的迭代器。

1.2 构造函数

① 功能描述:创建vector容器

② 函数原型:

  1. vector v;
  2. vector(v.begin(), v,end()); //将v[begin().end())区间(前闭后开)中的元素拷贝给本身。
  3. vector(n, elem); //构造函数将n个elem拷贝给本身
  4. vector(const vector &vec); //拷贝构造函数
#include <iostream>
using namespace std;
#include<vector> 

void printVector(vector<int>&v)   //各种容器的接口,v1容器传进去,就打印v1容器

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


//vector容器构造
void test01()

    vector<int> v1; //默认构造  无参构造

    for (int i = 0; i < 10; i++)
    
        v1.push_back(i);
    

    printVector(v1);

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

    printVector(v2);

    //n个elem方式构造

    vector<int>v3(10, 100); //这是10个100,不是100个10

    printVector(v3);

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

    printVector(v4);


int main()

    test01();

    system("pause");

    return 0;

运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
请按任意键继续. . .

1.3 赋值操作

① 功能描述:给vector容器进行赋值。

② 函数原型:

  1. vector& operator=(const vector &vec); //重载等号操作符。
  2. assign(beg,end); //将[beg,end)区间中的数据拷贝赋值给本身。
  3. assign(n,elem); //将n个elem拷贝赋值给本身。

③ vector赋值方式比较简单,使用operator=,或者assign都可以。

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

//vector赋值

void printVector(vector<int>& v)

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


void test01()

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

    //赋值 operator=
    vector<int>v2;
    v2 = v1;
    printVector(v2);

    //assign
    vector<int>v3;
    v3.assign(v1.begin(), v1.end());  //提供两个迭代器,两个迭代器区间中的元素都赋值给vector容器,区间为前闭后开
    printVector(v3);

    //n个elem方式赋值
    vector<int>v4;
    v4.assign(10, 100);
    printVector(v4);



int main()

    test01();

    system("pause");

    return 0;

运行结果:

0123456789
0123456789
0123456789
100100100100100100100100100100
请按任意键继续. . .

1.4 容量和大小

① 功能描述:对vector容器的容量和大小操作。

② 函数原型:

//判断容器是否为空

  1. empy();

//容器的容量

  1. capacity();

//返回容器中元素的个数

  1. size();

//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(int num);

//重新指定容器的长度为num,若容器变成,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(int num, elem);

③ vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数。

④ vector 容器的大小不能超出它的容量,在大小等于容量的基础上,只要增加一个元素,就必须分配更多的内存。注意,这里的“更多”并不是 1 个。换句话说,当 vector 容器的大小和容量相等时,如果再向其添加(或者插入)一个元素,vector 往往会申请多个存储空间,而不仅仅只申请 1 个。

⑤ 一旦 vector 容器的内存被重新分配,则和 vector 容器中元素相关的所有引用、指针以及迭代器,都可能会失效,最稳妥的方法就是重新生成。

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

//vector容器的容量和大小操作

void printVector(vector<int>&v)

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


void test01()

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

    if (v1.empty()) //为真 代表容器为空
    
        cout << "v1为空" << endl;
    
    else
    
        cout << "v1不为空:" << endl;
        cout << "capacity容量:" << v1.capacity() <<endl;
        cout << "v1的大小为:" << v1.size() << endl;

        //重新指定大小
        v1.resize(15);  //如果重新指定的比原来长了,默认用0填充新的位置
        printVector(v1);

        v1.resize(20,100);  //利用重载版本,参数2可以指定默认填充值
        printVector(v1);

        v1.resize(5);  //如果重新指定的比原来短了,超出的部分会删除掉
        printVector(v1);
    



int main()

    test01();

    system("pause");

    return 0;

运行结果:

0123456789
v1不为空:
capacity容量:13
v1的大小为:10
012345678900000
012345678900000100100100100100
01234
请按任意键继续. . .

1.5 插入删除

① 功能描述:对vector容器进行插入、删除操作。

② 函数原型:

  1. push_back(ele); //尾部插入元素ele
  2. pop__back(); //删除最后一个元素
  3. insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  4. insert(const_iterator pos, int count ele); //迭代器指向位置pos插入count个元素
  5. erase(const_iterator pos); //删除迭代器指向的元素
  6. erase(cons_titerator start, const_iterator end); //删除迭代器从start到end之间的元素
  7. 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 test01()

    vector<int>v1;
    //尾插
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    //遍历
    printVector(v1);

    //尾删
    v1.pop_back();
    printVector(v1);

    //插入 参数是迭代器
    v1.insert(v1.begin(), 100);
    printVector(v1);

    //删除  参数也是迭代器
    v1.insert(v1.begin(),2,999);
    printVector(v1);

    //删除
    v1.erase(v1.begin());
    printVector(v1);

    //清空  方式一:
    v1.erase(v1.begin(), v1.end());
    printVector(v1);

    //清空  方式二:
    v1.clear();
    printVector(v1);



int main()

    test01();

    system("pause");

    return 0;

运行结果:

10 20 30 40 50
10 20 30 40
100 10 20 30 40
999 999 100 10 20 30 40
999 100 10 20 30 40
请按任意键继续. . .

1.6 数据存取

① 功能描述:对vector中的数据存取操作。

② 函数原型:

  1. at(int idx); ///返回索引idx所指的数据。
  2. operator[]; //返回索引idx所指的数据。
  3. front(); //返回容器中第一个数据元素
  4. back(); //返回容器中最后一个数据元素

③ 除了用迭代器获取vector容器中元素,[]和at也可以。

④ front返回容器第一个元素。

⑤ back返回容器最后一个元素。

#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 test01()

    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;

    //利用at方式访问元素
    for (int i = 0; i < v1.size(); i++)
    
        cout << v1.at(i) << " ";
    
    cout << endl;

    //获取第一个元素
    cout << "第一个元素为:" << v1.front() << endl;

    //获取最后一个元素
    cout << "最后一个元素为:" << v1.back() << endl;


int main()

    test01();

    system("pause");

    return 0;


运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
第一个元素为:0
最后一个元素为:9
请按任意键继续. . .

1.7 互换容器

① 功能描述:实现两个容器内元素进行互换。

② 函数原型:swao(vec); //将vec与本身的元素互换

③ swap可以使两个容器互换,可以达到实用的收缩内存效果。

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

//vector容器互换

void printVector(vector<int>v)

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



//1、基本使用
void test01()

    cout << "交换前:" << endl;

    vector<int>v1;
    for (int i = 0; i < 10; i++)
    
        v1.push_back(i);
    
    
    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);


//2、实际用途
//巧用swap可以收缩内存空间
void test02()

    vector<int>v;
    for (int i = 0; i < 100000; i++)
    
        v.push_back(i);
    
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;

    v.resize(3);  //重新指定大小
    cout << "v的容量为:" << v.capacity() << endl;  //resize操作,容量并没有变,多余的容量浪费了
    cout << "v的大小为:" << v.size() << endl;

    //巧用swap收缩内存
    vector<int>(v).swap(v);  //vector<int>(v)创建了一个为匿名对象,会按v的大小初始化这个匿名对象容器的大小
                             //.swap(v)会对匿名对象容器与原容器做一个交换,则原容器的指针指向匿名对象的容器,匿名对象的容器的指针改为指向原容器
                             //	系统运行完创建匿名函数这一句语句后对匿名对象的指针(即地址、内存)进行回收

    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;


int main()

    test01();
    test02();

    system("pause");

    return 0;

运行结果:

交换前:
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
v的容量为:138255
v的大小为:100000
v的容量为:138255
v的大小为:3
v的容量为:3
v的大小为:3
请按任意键继续. .

1.8 预留空间

① 功能描述:减少vector在动态扩展容量时的扩展次数。

 

② 函数原型:

  1. reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。
#include <iostream>
using namespace std;
#include<vector> 

//vector容器 预留空间

void test01()


    vector<int>v;

    int num = 0;  //统计开辟次数

    int* p = NULL; 

    for (int i = 0; i < 100000; i++)
    
        v.push_back(i);

        if (p != &v[0])  //一开始指针不指向容量首地址,所以让指针指向容量首地址,开辟内存次数加1
        
            p = &v[0]; 
            num++;   //由于容量不够,会再次开辟一段容量更大的内存空间,原小容量的内存空间被释放

        
    

    cout << "num:" << num << endl;



void test02()


    vector<int>v;

    //预留空间
    v.reserve(100000);

    int num = 0;  //统计开辟次数

    int* p = NULL;

    for (int i = 0; i < 100000; i++)
    
        v.push_back(i);

        if (p != &v[0])
        
            p = &v[0];
            num++;
        
    

    cout << "num:" << num << endl;



int main()

    test01();
    test02();

    system("pause");

    return 0;

运行结果:

num:30
num:1
请按任意键继续. . .

C++中vector容器

想循环取出一个不知道大小的 int型的vector中的数据,如何实现

#include "stdafx.h"
#include "iostream"
#include <vector>
using namespace std;
vector<int> vectorInt;

void initVector()

int ia[] = 1,3,5,7,9,11,13,15;
vectorInt.resize(8);
copy(ia, ia+8, vectorInt.begin());
vectorInt.push_back(17);//你还可以添加很多

void showVector()

cout<<"容器容量:"<<vectorInt.capacity()<<endl;
cout <<"容器元素:"<<vectorInt.size() << endl;
vector<int>::const_iterator cIter;

for(cIter=vectorInt.begin();cIter!=vectorInt.end();cIter++)

cout<<*cIter<<" ";

cout <<endl;


int main(int argc, char* argv[])

initVector();
showVector();
getchar();
return 0;

刚才简单给你写了一个追问

如果我想从一个数据库中取出数据,插入到另一个数据库里面呢

追答

一个数据库换表还是2个数据库? 按你想法 用 vector 可以先 提取保存至vector 然后通过遍历再写进去 上面足够了 就少数据库部分,不过觉得,效率是个问题 中间环节完全是多余的

参考技术A 使用下标:
for (i = 0; i < v.size(); ++ i)
cout << v[i] << " ";

使用迭代器:
vector<int> :: iterator it1;
for (it1 = v.begin( ); it1 != end(); ++ it1)
cout << *it1 << " ";追问

如果我想从一个数据库中取出数据,插入到另一个数据库里面呢

追答

如果数据很多,自然是需要同时打开两个数据库,就用循环来对拷

参考技术B 这是一个完整的例子
#include <VECTOR>
#include <IOSTREAM>

using namespace::std;

int main()

vector <int> temp;
vector<int>::iterator itr;
for (int i=0; i<10;i++) //这里放10个元素只是用来测试的

temp.push_back(i);


for (itr = temp.begin() ;itr != temp.end();++itr)//从第一个打印到最后一个

cout<< *itr<<endl;

return 0;

以上是关于C++ 16 vector容器的主要内容,如果未能解决你的问题,请参考以下文章

c++ 容器含义

C++提高笔记(二:容器和常用算法部分)

C++ vector类型要点总结(以及各种algorithm算法函数)

每日打卡c++中vector容器使用

C++一些算法题总结

C++vector用法总结