STL详解(verctor容器)

参考链接

容器

vector容器

vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:

#include <vector>
using namespace std;

vector容器的创建

(1)

vector<int> v;

注意,这是一个空的 vector 容器,因为容器中没有元素,所以没有为其分配空间。当添加第一个元素(比如使用 push_back() 函数)时,vector 会自动分配内存。
在创建好空容器的基础上,还可以像下面这样通过调用 reserve() 成员函数来增加容器的容量:

v.reserve(20);

这样就设置了容器的内存分配,即至少可以容纳 20 个元素。注意,如果 vector 的容量在执行此语句之前,已经大于或等于 20 个元素,那么这条语句什么也不做;另外,调用 reserve() 不会影响已存储的元素,也不会生成任何元素,即 values 容器内此时仍然没有任何元素。
(2) 除了创建空 vector 容器外,还可以在创建的同时指定初始值以及元素个数,比如:

vector<int> p {
    
    2, 3, 5, 7, 11, 13, 17, 19};

(3)在创建 vector 容器时,也可以指定元素个数:

vector<double> v(20);

注意,圆括号 () 和大括号 {} 是有区别的,前者(例如 (20) )表示元素的个数,而后者(例如 {20} ) 则表示 vector 容器中只有一个元素 20。
如果不想用 0 作为默认值,也可以指定一个其它值,例如:

vector<double> v(20, 1.0);

第二个参数指定了所有元素的初始值,因此这 20 个元素的值都是 1.0。
圆括号中的参数既可以用常量来表示,也可以用变量来表示。
(4)通过存储元素类型相同的其它 vector 容器,也可以创建新的 vector 容器,例如:

vector<char> v1(5, 'c');
vector<char> v2(v1);

vector 函数的用法

函数成员 函数功能
begin() 返回指向容器中第一个元素的迭代器。
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin() 返回指向最后一个元素的迭代器。
rend() 返回指向第一个元素所在位置前一个位置的迭代器。
size() 返回实际元素个数。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
push_back() 在序列的尾部添加一个元素。
pop_back() 移出序列尾部的元素。
insert() 在指定的位置插入一个或多个元素。
erase() 移出一个元素或一段元素。
clear() 移出所有的元素,容器大小变为 0。
swap() 交换两个容器的所有元素。

在这里插入图片描述
关于函数begin(),end()的用法

#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int main()
{
    
    
    vector<int> v{
    
    1, 2, 3, 4, 5};
    for(auto i = v.begin(); i != v.end(); i ++)
    {
    
    
        cout << *i << ' ';
    }
    cout << endl;
}
//输出 1 2 3 4 5

关于函数rbegin(),rend()的用法

for (auto first = values.rbegin(); first != values.rend(); ++first) {
    
    
    cout << *first << " ";
}
//输出 5 4 3 2 1

vector容器中元素的访问方法

vector容器可以像数组那样访问。并且下标从0开始。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    
    
    vector<int> values{
    
    1,2,3,4,5};
    //获取容器中首个元素
    cout << values[0] << endl;
    //修改容器中下标为 0 的元素的值
    values[0] = values[1] + values[2] + values[3] + values[4];
    cout << values[0] << endl;
    return 0;
}
//输出 1 14

vector容器中front(),back()用法

可以访问也可以修改首尾的值。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    
    
    vector<int> values{
    
    1,2,3,4,5};
    cout << "values 首元素为:" << values.front() << endl;
    cout << "values 尾元素为:" << values.back() << endl;
    //修改首元素
    values.front() = 10;
    cout <<"values 新的首元素为:" << values.front() << endl;
    //修改尾元素
    values.back() = 20;
    cout << "values 新的尾元素为:" << values.back() << endl;
    return 0;
}
//输出:
/*
values 首元素为:1
values 尾元素为:5
values 新的首元素为:10
values 新的尾元素为:20
*/

访问多个元素的方法

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    
    
    vector<int> values{
    
    1,2,3,4,5};
    //从下标 0 一直遍历到 size()-1 处
    for (int i = 0; i < values.size(); i++) {
    
    
        cout << values[i] << " ";
    }
    return 0;
}
//输出结果:1 2 3 4 5

push_back()

该成员函数的作用是在容器尾部添加一个函数。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    
    
    vector<int> values{
    
    };
    values.push_back(1);//在尾部插入一个1,由于之前没有元素,所以1放在容器的首位
    values.push_back(2);
    for (int i = 0; i < values.size(); i++) {
    
    
        cout << values[i] << " ";
    }
    return 0;
}
//输出 1 2

insert()

四个方法:

函数 用法
iterator insert(pos,elem) 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。
iterator insert(pos,n,elem) 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。
iterator insert(pos,first,last) 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。
iterator insert(pos,initlist) 在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include<array>
using namespace std;
const int N = 1e5 + 10;
int main()
{
    
    
    vector<int> v{
    
    1, 2};
    v.insert(v.begin() + 1, 3); //{1, 3, 2}
    v.insert(v.end(), 2, 5);//{1, 3, 2, 5, 5}
    array<int, 3> test{
    
    7, 8, 9};
    v.insert(v.end(), test.begin(), test.end());//{1, 3, 2, 5, 5, 7, 8, 9}
    v.insert(v.end(), {
    
    10, 11});//{1, 3, 2, 5, 5, 7, 8, 9, 10, 11}
    for(auto i = v.begin(); i != v.end(); i ++)
    cout << *i << ' '; 
    //输出:1, 3, 2, 5, 5, 7, 8, 9, 10, 11
}

vector容器的元素删除方法

函数 功能
pop_back() 删除 vector 容器中最后一个元素,该容器的大小(size)会减 1,但容量(capacity)不会发生改变。
erase(pos) 删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。该容器的大小(size)会减 1,但容量(capacity)不会发生改变。
swap(beg)、pop_back() 先调用 swap() 函数交换要删除的目标元素和容器最后一个元素的位置,然后使用 pop_back() 删除该目标元素。
erase(beg,end) 删除 vector 容器中位于迭代器 [beg,end)指定区域内的所有元素,并返回指向被删除区域下一个位置元素的迭代器。该容器的大小(size)会减小,但容量(capacity)不会发生改变。
remove() 删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。
clear() 删除 vector 容器中所有的元素,使其变成空的 vector 容器。该函数会改变 vector 的大小(变为 0),但不是改变其容量。
#include <vector>
#include <iostream>
using namespace std;
int main()
{
    
    
    vector<int>demo{
    
     1,2,3,4,5 };
    demo.pop_back();
    //输出 dmeo 容器新的size
    cout << "size is :" << demo.size() << endl;
    //输出 demo 容器新的容量
    cout << "capacity is :" << demo.capacity() << endl;
    for (int i = 0; i < demo.size(); i++) {
    
    
        cout << demo[i] << " ";
    }
    return 0;
}

pop_back()用法简单,无返回值。
运行结果:
size is :4
capacity is :5
1 2 3 4

erase()

#include <vector>
#include <iostream>
using namespace std;
int main()
{
    
    
    vector<int>demo{
    
     1,2,3,4,5 };
    auto iter = demo.erase(demo.begin() + 1);//删除元素 2
    //输出 dmeo 容器新的size
    cout << "size is :" << demo.size() << endl;
    //输出 demo 容器新的容量
    cout << "capacity is :" << demo.capacity() << endl;
    for (int i = 0; i < demo.size(); i++) {
    
    
        cout << demo[i] << " ";
    }
    //iter迭代器指向元素 3
    cout << endl << *iter << endl;
    return 0;
}

输出结果:
size is :4
capacity is :5
1 3 4 5
3

如果不在意容器中元素的排列顺序,可以结合 swap() 和 pop_back() 函数,同样可以实现删除容器中指定位置元素的目的。

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    
    
    vector<int>demo{
    
     1,2,3,4,5 };
    //交换要删除元素和最后一个元素的位置
    swap(*(std::begin(demo)+1),*(std::end(demo)-1));//等同于 swap(demo[1],demo[4])
   
    //交换位置后的demo容器
    for (int i = 0; i < demo.size(); i++) {
    
    
        cout << demo[i] << " ";
    }
    demo.pop_back();
    cout << endl << "size is :" << demo.size() << endl;
    cout << "capacity is :" << demo.capacity() << endl;
    //输出demo 容器中剩余的元素
    for (int i = 0; i < demo.size(); i++) {
    
    
        cout << demo[i] << " ";
    }
    return 0;
}

输出结果:
1 5 3 4 2
size is :4
capacity is :5
1 5 3 4
还可以删除一个区间内所有元素:iterator erase (iterator first, iterator last);
其中 first 和 last 是指定被删除元素区域的迭代器,同时该函数会返回指向此区域之后一个位置的迭代器。

auto iter = demo.erase(demo.begin()+1, demo.end() - 2);

remove()

如果要删除容器中和指定元素值相同的所有元素,可以使用 remove() 函数

#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);
    cout << "size is :" << demo.size() << endl;
    cout << "capacity is :" << demo.capacity() << endl;
    //输出剩余的元素
    for (auto first = demo.begin(); first < iter;++first) {
    
    
        cout << *first << " ";
    }
    return 0;
}

输出:
size is :6
capacity is :6
1 4 5
注意,在对容器执行完 remove() 函数之后,由于该函数并没有改变容器原来的大小和容量,因此无法使用之前的方法遍历容器,而是需要向程序中那样,借助 remove() 返回的迭代器完成正确的遍历。

clear()

直接用即可。

set,map的用法

#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <bits/stdc++.h>
using namespace std;
int main() {
    
    
    map<string, int> mp;
    mp.insert({
    
    "mp", 1});
    mp.insert({
    
    "mp1", 2});
    set<int> ss;
    int a[100] = {
    
    1, 2, 3, 4, 5};
    for(int i = 4; i >= 0; i --)
    ss.insert(a[i]);

    for(map<string, int> :: iterator i = mp.begin(); i != mp.end(); i ++)
    {
    
    
        cout << i->first << ' ' << i->second << endl;
    }
    for(auto i = ss.begin(); i != ss.end(); i ++)
    {
    
    
        cout << *i << ' ';
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_47783181/article/details/110197051