【C++】STL之vector操作

简介: 【C++】STL之vector操作

简介

vector是stl中的一种数组容器,vector在英文中有矢量的意思,但实际上在数据结构中就是一种类似于数组的结构;

与之前学习的string不同,string是针对字符串的一个容器,而vector却是一个类模板,意思就是vector这个容器中,可以存放的数据不只只有内置类型,同时也有自定义类型;

内置类型 自定义类型
vector< int > vector< string >
vector< double > vector< vector< int > >
vector< char > ......
...... ......

vector中的成员类型

作为一个类模板,vector中有许多的成员类型,这些成员类型一般是在类域中typedef出来的类型;

[图片源自cplusplus]


模板参数

该类模板中共有两个模板参数;

  • class T
    该模板参数为数据类型,即vector中保存的数据类型;
  • class Alloc = allocator< T >
    该模板参数为内存池的类型,不过该模板参数给了一个缺省值,默认所给的这个缺省值为标准库中的内存池,同时也可以自己实现一个内存池进行传参;

头文件的包含

在使用vector时需要包含头文件;

#include <vector>

构造函数

在C++98的版本中,vector共有四个构造函数;

explicit vector (const allocator_type& alloc = allocator_type()) 构造一个空的vector
explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()); 用n个val进行构造
template vector (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()); 迭代器构造
vector (const vector& x) 拷贝构造
#include<iostream>
#include<vector>
using namespace std;
namespace std {
  void test_vector_Creat() {
    /*
     * 构造一个空的vector<int> 对象
     */
    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    /*
     * 用10个6构造一个vector<int> 对象
     */
    vector<int> b(10, 6);
    /*
     * 用b的迭代器范围构造一个vector<int> 对象
     */
    vector<int> c(b.begin() + 6, b.end());
    /*
     * 以c作为参数拷贝构造一个vector<int> 对象
     */
    vector<int> Copy_c(c);
    cout << "a:";
    for (auto in : a) {
      cout << in << " ";
    }
    cout << endl;
    cout << "b:";
    for (auto in : b) {
      cout << in << " ";
    }
    cout << endl;
    cout << "c:";
    for (auto in : c) {
      cout << in << " ";
    }
    cout << endl;
    cout << "Copy_c:";
    for (auto in : Copy_c) {
      cout << in << " ";
    }
    cout << endl;
  }
}

vector的访问方式:

下标[ ]

在vector中,可以实现像数组或者string那样以下标和下标访问操作符[ ]进行数据的访问;

最主要的原因是在vector中存在与string容器一样的[ ]操作符重载;

同样的,在vector中也拥有两个版本的重载,返回值中的reference即为引用的意思,返回值返回一个引用;

同时另一个版本的const_reference返回值为返回一个const修饰的引用;

在使用时会自动根据需要进行返回;


迭代器

迭代器的使用方法与string中的迭代器使用方法相同,唯一的不同点是,在vector中使用迭代器不能使用类名,而是应该使用类型名;

vecror <int> ::iterator it = xxx.begin();

该迭代器也为前闭后开区间;


范围for

范围for的底层实际上就是替换成了迭代器,对于存储内置类型的vector来说,并不会有什么影响,而若是使用存储自定义类型的vector的范围for则需要注意;

vector<string> strV;
strV.push_back("张三");
strV.push_back("李四");
strV.push_back("王五");
for(auto str:strV){
  cout<<str<<endl;
}

在上面这段代码中出现了一个问题,由于范围for的底层为使用迭代器遍历整个vector,但是范围for只是将一个对象赋值到一个变量;

在这里将每个string对象赋值给str,由于这里是临时对象,将会出现深浅拷贝的问题,若是将vector中的每个string对象都赋值到str中,将会进行隐式类型转换并进行深拷贝,加大开销;

若是想用范围for来遍历存储自定义类型的vector,则最好的办法是利用引用,若是害怕数据在遍历过程中被更改,即可以加上const修饰;

vector<string> strV;
strV.push_back("张三");
strV.push_back("李四");
strV.push_back("王五");
for(const auto& str:strV){
  cout<<str<<endl;
}

交换swap

在vector中也有一个swap成员函数,该函数也是为了避免容器自定义类型使用标准库中的swap函数导致产生过大开销;

vector::swap( ) 的使用也与string::swap( ) 相同,本质上就是交换指针或者数据;

vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
vector<int> v2;
v1.push_back(5);
v1.push_back(5);
v1.push_back(3);
v1.push_back(3);
v1.swap(v2);
相关文章
|
6天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
22 7
|
23天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
48 4
|
25天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
52 5
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
5天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
23 0
|
1月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
47 0
|
9天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
18 0
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
79 5
|
2月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
26 1
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
72 1