美文网首页C++ STL
C++ STL 之 vectot(一)

C++ STL 之 vectot(一)

作者: 思想永不平凡 | 来源:发表于2020-01-10 15:05 被阅读0次

今天我们将更新 C++ STL 中 vector 容器的使用,之前我们介绍了 array 容器的使用,其实容器之间有很多相似的地方,这些相似的地方我会稍微提一提,重点放在其他部分。



vector 容器的创建与初始化

vector<T> 是含 T 类型元素的容器, 与 array< T , N > 不同的是,vector<T> 容器的大小是可以自动增长,从而理论上可以包含任意数量的元素。因此类型参数 T 不再需要指定其大小。当元素个数超出 vector 当前容量,就会自动分配更多的空间。
vector<T> 可以很好地代替数组,尽管在容器中增加和删除元素时会有一些开销,但是这个开销相对较小,不会对你的程序有明显的影响。vector<T> 容器在头文件 vector 中。
当然如果你不想记这些头文件,使用

#include <bits/stdc++.h>

也是可以的。

vector<int> data;

上面时定义一个存放 int 的 vector 容器,由于容器里面没用元素,也就没有分配空间。我们可以使用reserve(n) 来增加容器的容量。但是必须得注意得是,当前容器得容量大于n,并不能增加该容器的大小,同时即使使用了 reserve() ,容器内依然没有任何数据,容器没有得到内存,只有增加了元素后,容器才会得到内存。
示例如下:

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> data1;
    cout<<"data1: "<<data1.size()<<endl;
    data1.reserve(5);
    cout<<"data1: "<<data1.size()<<endl;
    cout<<endl;
    vector<int> data2(6);
    cout<<"data2: "<<data2.size()<<endl;
    data2.reserve(5);
    cout<<"data2: "<<data2.size()<<endl;
    return 0;
}

结果如下:


image.png

size() 是得到容器的大小,array 中有,其他容器也是有的。

同时需要注意到的是,使用了 reserve() 增加容器的内存后,现有的迭代器会失效,因为容器发生改变了,而且动态分配内存是有一定的开销的,最好就在初始化时分配,指定其大小。

vector<int> data1 {1,1,2,3,5};
这样初始化时,data1 的大小就是 5 了,同时每个位置都被分配了初值。
值得注意的是,在 array 中,我们可以这样
array<int,10> data1 {1,1,2,3,5};
前五个元素被赋值,后五个元素保存默认,容器大小为10。
vector<int> data2(10);
这样初始化时,data2 的大小为10,所有元素保持默认值。
vector<int> data3(10,1);
data3 的大小为10,所有元素默认值为1。
示例如下:

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> data1 {1,1,2,3,5};
    vector<int> data2(10);
    vector<int> data3(10,1);
    cout<<"data1: "<<data1.size()<<endl;
    for(auto&& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    cout<<"data2: "<<data2.size()<<endl;
    for(auto&& data : data2){
        cout<<data<<" ";
    }
    cout<<endl;
    cout<<"data3: "<<data3.size()<<endl;
    for(auto&& data : data3){
        cout<<data<<" ";
    }
    cout<<endl;
    return 0;
}

结果如下:


image.png

我们知道 reserve() 可以增加容器的容量;这时元素的个数并没有改变。但是通过调用成员函数 resize() 可以改变容器大小,也可以指定容器中部分元素的值,以一个例子为例。
示例如下:

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> data1 {1,1,2,3,5};
    cout<<"data1: "<<data1.size()<<endl;
    for(auto& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    data1.resize(10);
    cout<<"data1: "<<data1.size()<<endl;
    for(auto& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    data1.resize(15,1);
    cout<<"data1: "<<data1.size()<<endl;
    for(auto& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    data1.resize(4);
    cout<<"data1: "<<data1.size()<<endl;
    for(auto& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    data1.resize(3,1);
    cout<<"data1: "<<data1.size()<<endl;
    for(auto& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    return 0;
}

结果如下:


image.png

vector 访问元素

我们可以使用方括号进行索引,从 0 开始,和数组类似。
示例如下:

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> data1(10,1);
    for(int i=2;i<data1.size();i++){
        data1[i]=data1[i-1]+data1[i-2];
    }
    for(auto& data : data1){
        cout<<data<<" ";
    }
    cout<<endl;
    return 0;
}

结果如下:


image.png

之前,我们在 array 容器中介绍了 front() ,back(),swap() 成员函数,而在 vector 容器中这些也是一样的作用。
示例如下:

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> data1(10,1);
    for(int i=2;i<data1.size();i++){
        data1[i]=data1[i-1]+data1[i-2];
    }
    int first=data1.front();
    auto last=data1.back();
    cout<<"the first elemmet is "<<first<<endl;
    cout<<"the last elemmet is "<<last<<endl;
    cout<<endl;
    swap(data1.front(),data1.back());
    cout<<"the first elemmet is "<<data1.front()<<endl;
    cout<<"the last elemmet is "<<data1.back()<<endl;
    return 0;
}

结果如下:


image.png

之后将介绍 vector 的迭代器以及其他的使用。

相关文章

  • C++ STL 之 vectot(一)

    今天我们将更新 C++ STL 中 vector 容器的使用,之前我们介绍了 array 容器的使用,其实容器之间...

  • C++ STL 之 vectot(三)

    今天我们继续更新 C++ STL 中 vector 容器的使用 vector 容器增加元素 vector 容器增加...

  • C++ STL 之 vectot(四)

    今天我们继续更新 C++ STL 中 vector 容器的使用 vector 容器删除元素 使用 clear() ...

  • C++ STL 之 vectot(二)

    今天我们继续更新 C++ STL 中 vector 容器的使用 vector 迭代器使用 与 array 类似,v...

  • [C++] STL 容器

    参考:[C++] STL 容器 (一) - 基本介紹[C++] STL 容器 (二) - Iterator 部分示例:

  • 读书笔记17.06.03

    C++ STL:Listlist是C++标准模版库(STL,Standard Template Library)中...

  • C++ STL 学习笔记

    C++ STL 学习笔记

  • STL初认识

    一 C++ 与STL 历史 STL全称standard template library,由Alexander S...

  • STL之参考文献

    C++标准库是离不开模板的,STL占了C++标准库80%以上。 学习STL(c++ 98)的主要参考: gcc 3...

  • Boolan C++标准库 第一周

    C++标准库 第一讲 一、认识headers、版本 1.C++标准库 vs STL C++标准库大于STL(标准...

网友评论

    本文标题:C++ STL 之 vectot(一)

    本文链接:https://www.haomeiwen.com/subject/cvwpactx.html