c++ vector容器的常用方法整理

整理一下vector常用的一些方法

参考链接

  1. cpp reference vector
  2. cpp reference vector头文件

vector主要是拿来当作动态数组使用的,使用时需要包含头文件 <vector>

初始化一个vector对象。

一些常用的初始化方法。

//practice string class
#include <iostream>
#include <string>
#include <vector>

int main()
{
    //只是定义一个vector变量,内容为空。
    std::vector<int> vi;
    std::cout << vi.size() << std::endl;    //size()返回元素个数为0

    //使用初始化列表初始化vi2
    std::vector<int> vi2 = {1,3,5,7,9};
    //使用5个10初始化vi3的内容
    std::vector<int> vi3(5,10);
    for(auto i : vi3) std::cout << i << std::endl;
    std::vector<int> vi4(vi2);
    for(auto i : vi4) std::cout << i << std::endl;
    std::vector<int> vi5(vi3);      //使用vi3初始化vi5
    for(auto i : vi5) std::cout << i << std::endl;
    std::vector<int> vi6(vi3.begin(), vi3.begin()+2);    //使用其他容器的迭代器初始化,从第0个到第2个
    for(auto i : vi6) std::cout << i << std::endl;
    return 0;
}

访问容器内的元素,常用的at(idx)函数和[idx].

//practice string class
#include <iostream>
#include <string>
#include <vector>

int main()
{

    std::vector<int> vi = {1, 2, 3, 4, 5};

    std::cout << vi.size() << std::endl;
    //使用[]访问容器的元素没有下标范围检查,vi[5]的值是0
    std::cout << vi[0] << vi[1] << vi[2] << vi[3] << vi[4] << vi[5] << std::endl;

    std::cout << vi.at(0) << vi.at(1) << vi.at(2) << vi.at(3) << vi.at(4) << std::endl;
    //std::cout << vi.at(5) << std::endl;   //使用at访问,如果下标大于size(),则会抛出越界异常,产生崩溃

    for(auto i : vi) std::cout << i;    //通过for循环输出vi的值
    std::cout << std::endl;

    for(auto i = 0; i < vi.size(); i++)
    {
        vi[i] += 5; //通过下标修改vi的值
    }
    for(auto i : vi) std::cout << i;
    std::cout << std::endl;
    return 0;
}

修改容器内的元素,向vector内添加/删除元素

push_back()函数:向容器尾部添加元素

pop_back()函数:移除容器尾部的元素

//practice string class
#include <iostream>
#include <string>
#include <vector>

int main()
{
    //只是定义一个vector变量,内容为空。
    std::vector<int> vi;

    vi.push_back(10);
    vi.push_back(20);
    vi.push_back(30);

    std::cout << vi.size() << std::endl;

    for(auto i : vi)
        std::cout << i << std::endl;
    
    vi.pop_back();
    std::cout << "--------------------" << std::endl;
    std::cout << vi.size() << std::endl;
    for(auto i : vi)
        std::cout << i << std::endl;
    return 0;
}

输出结果:

3
10
20
30
--------------------
2
10
20

使用insert()在某个固定位置插入元素

//practice string class
#include <iostream>
#include <string>
#include <vector>

int main()
{

    std::vector<int> vi = {1, 2, 3, 4, 5};

    vi.insert(vi.begin(), 20);  //在开始位置前插入元素20
    for(auto i : vi) std::cout << i << ",";
    std::cout << std::endl;

    vi.insert(vi.begin()+3, 30);    //在原来的第3个元素前面插入30.
    //20  1  2   3  4  5
    //         ^
    //         30
    for(auto i : vi) std::cout << i << ",";
    std::cout << std::endl;

    vi.insert(vi.begin()+5, 4, 40);    //在原来的第5个元素前面插入4个40.
    for(auto i : vi) std::cout << i << ",";
    std::cout << std::endl;

    vi.clear();
    vi = {1, 2, 3, 4, 9, 10};
    std::vector<int> vi2 = {5, 6, 7, 8, 9};
    vi.insert(vi.begin()+4, vi2.begin(), vi2.begin()+4);    //将vi2的第0个到第4个元素插入到vi的第4个位置前面
    for(auto i : vi) std::cout << i << ",";
    std::cout << std::endl;
    return 0;
}

运行结果:

20,1,2,3,4,5,
20,1,2,30,3,4,5,
20,1,2,30,3,40,40,40,40,4,5,
1,2,3,4,5,6,7,8,9,10,

清空容器内的内容:clear()

//practice string class
#include <iostream>
#include <string>
#include <vector>

int main()
{

    std::vector<int> vi = {1, 2, 3, 4, 5};

    std::cout << vi.size() << std::endl;
    //清空容器的内容
    vi.clear();

    std::cout << "After clear: " << vi.size() << std::endl;


    return 0;
}

运行结果:

5
After clear: 0

删除指定位置的元素, 参数可以传入要删除位置的迭代器,例如erase(vi.begin())或要删除的范围erase(vi.begin(), vi.begin()+2).

//practice string class
#include <iostream>
#include <string>
#include <vector>

int main()
{

    std::vector<int> vi = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::cout << vi.size() << std::endl;

    for(auto i : vi) std::cout << i << " ";
    std::cout << std::endl;

    vi.erase(vi.begin()+5);

    //前回erase后,vi.begin()+5的元素和最初的vi的元素不同,迭代器失效
    vi.erase(vi.begin()+5);

    std::cout << vi.size() << std::endl;
    for(auto i : vi) std::cout << i << " ";
    std::cout << std::endl;

    vi.erase(vi.begin()+2, vi.begin()+5);   //左闭右开,位于begin()+2的元素会被移除,但是begine()+5的不会被移除
    std::cout << vi.size() << std::endl;
    for(auto i : vi) std::cout << i << " ";
    std::cout << std::endl;
    return 0;
}

迭代器

vector提供了begin(),cbegin(),end(),cend(),rbegine(),rend(),crbegin(),crend()几种迭代器。
end()指向的是最后一个元素的下一个位置,而不是最后一个元素。
例如,vector<int> vec = {1, 2, 3, 4, 5};,则end()指向5后面的位置。rend()指向1前面的位置。

//practice string class
#include <iostream>
#include <vector>

int main()
{

    std::vector<int> vi = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    for(std::vector<int>::iterator it = vi.begin(); it != vi.end(); it++)
    {
        *it += 10;  //通过iterator修改容器内元素
    }

    for(auto i : vi) std::cout << i << "  ";
    std::cout << std::endl;

    for(std::vector<int>::const_iterator cit = vi.begin(); cit != vi.end(); cit++)
    {
        //*cit += 10; //编译error,不能够通过const_iterator修改容器的值
        std::cout << *cit << "  ";
    }
    std::cout << std::endl;
    return 0;

}

容器的其他信息

可以通过empty()来判断当前容器是否为空,或者判断begin()和end()是否相等。

//practice string class
#include <iostream>
#include <vector>

int main()
{

    std::vector<int> vi;

    std::cout << "empty:" << vi.empty() << " size = " << vi.size() << " begine == end ?" << (vi.begin() == vi.end()?  "Yes" : "No") << std::endl;

    vi.push_back(100);
    std::cout << "empty:" << vi.empty() << " size = " << vi.size() << " begine == end ?" << (vi.begin() == vi.end()?  "Yes" : "No") << std::endl;

    return 0;

}
empty:1 size = 0 begine == end ?Yes
empty:0 size = 1 begine == end ?No
posted @ 2025-03-05 15:51  酸菜馅粘豆包  阅读(53)  评论(0)    收藏  举报