C++ vector互换容器、预留空间以及通过find函数查找元素

386 阅读1分钟

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

1. vector互换容器

两个容器内元素的交换。

(1)基本用法

swap(vec) //将vec与本身的元素互换

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

void printVector(vector<int>&v)
{
    for(vector<int>::iterator it = v.begin();it != v.end();it++)
    {
        cout<< *it <<" ";
    }
    cout<<endl;
}
//vector容器赋值
void test()
{
    vector<int>v1;//默认构造函数,无参数
    for (int i = 0; i<10; i++)
    {
        v1.push_back(i);
    }
    cout<<"互换前:"<<endl;
    printVector(v1);

    //swap()
    vector<int>v2;
    for (int i = 10; i<20; i++)
    {
        v2.push_back(i);
    }
    printVector(v2);

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

int main(){
    test();
}

输出结果:

互换前:
0 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 17 18 19 
互换后
10 11 12 13 14 15 16 17 18 19 
0 1 2 3 4 5 6 7 8 9 

(2) swap()帮助减小不必要的内存消耗

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

void printVector(vector<int>&v)
{
    for(vector<int>::iterator it = v.begin();it != v.end();it++)
    {
        cout<< *it <<" ";
    }
    cout<<endl;
}
//vector容器赋值
void test()
{
    vector<int>v1;//默认构造函数,无参数
    for (int i = 0; i<10000; i++)
    {
        v1.push_back(i);
    }
    cout<<"v1的容量为:"<<v1.capacity()<<endl;
    cout<<"v1的长度为:"<<v1.size()<<endl;
    //将v1的容量缩减到3
    v1.resize(3);
    cout<<"v1的容量为:"<<v1.capacity()<<endl;//容量没变,内存空间浪费
    cout<<"v1的长度为:"<<v1.size()<<endl;
    //通过swap()操作缩减空间
    vector<int>(v1).swap(v1);
    cout<<"v1的容量为:"<<v1.capacity()<<endl;
    cout<<"v1的长度为:"<<v1.size()<<endl;
}

int main(){
    test();
}

输出结果:

v1的容量为:16384
v1的长度为:10000
v1的容量为:16384
v1的长度为:3
v1的容量为:3
v1的长度为:3

2. vector预留空间

减少vector在动态拓展容量时的拓展次数。

reserve(int len) //容器预留len个长度,预留位置不初始化,与resize不同,元素不可访问

3. vector实现查找功能

vector与map不同,没有自带的find功能,但可以通过头文件algorithm中find函数实现。

格式如下:

vector<T>::iterator it = find(vector数组中开始位置,vector数组中结束位置,value)

T : vector数组类型

value:要查找的值

代码如下:

#include <iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(){
    vector<int> v;

    v.push_back(10);
    v.push_back(9);
    v.push_back(4);

    int value;
    cout<<"请输入想要查找的数 ";
    cin>>value;

    vector<int>::iterator it = find(v.begin(),v.end(),value);

    if(it != v.end())
        cout<<*it<<endl;
    else
        cout<<"找不到"<<value<<endl;

    return 0;
}

输出结果:

请输入想要查找的数 10
10

附上find函数源码:

template <class _InputIterator, class _Tp>
inline _LIBCPP_INLINE_VISIBILITY
_InputIterator
find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
{
    for (; __first != __last; ++__first)
        if (*__first == __value_)
            break;
    return __first;
}