【C++】vector的使用(上)

简介: 【C++】vector的使用(上)

5229cf7042780c39066a2776e95a4d88.png在之前我们学习了string的使用与模拟实现,在参考文档中可以发现,vector和string以及其他的容器的接口基本都相同,所以这里也就简要的介绍一下。

同样的,在这里还是要说一下,对于STL库的学习,不可能在一朝一夕之间学完,要学会去查看文档和多练习vector参考文档


1. 主要结构


57863e5adeb01f2ab5deb8fbfc3b80c0.png

vector没有像string一样进行类型重定义typedef basic_string<char> string,所以在使用vector的时候要指定模板参数类型例如vector<int>


2. 构造函数与复制重载


04cc6d8330576fad6ccb9867b2cb74bd.png

可以看到vector的构造函数实现相较于string就简化了很多,一共分为四个,分别是默认构造,指定长度和值的构造,迭代器区间构造,拷贝构造

void Test_Construct()
{
  vector<int> v1;//默认构造
  vector<int> v2(10, 3);//指定长度和值的构造
  string s("aaaaaaaaaaaaaa");
  vector<char> v3(s.begin(), s.end());//迭代器区间构造
  vector<char> v4(v3);//拷贝构造
}


813baa4cdef1e4e2389b0639738202fb.png

通过监视查看四个对象的值如上。


3. 迭代器


由于vector也是通过动态数组实现的,所以原生指针就能很好的支持迭代器行为,所以在vector中的迭代器本质也是指针。

83ba2c8a73d526cd1bdf42fcc6f2212f.png

可以看到和string一样,vector的迭代器也分为普通迭代器,反向迭代器,const迭代器,const反向迭代器。

8af9c36d5cb96ad3a85ccab4456b5c38.png

对于迭代器和反向迭代器的工作方式如上图。


4. 容量相关


1.容量读取

1. size

dca4952fcca3a86826f26d3cd3dbc7f8.png

返回一个size_t类型的vector中数据个数


2. capacity

a42c06e2d6d9ca33336d23423ea3f4ca.png

返回一个size_t类型的vector的容量。

使用范例:

void Test_Capacity()
{
  vector<int> v;
  v.reserve(10);
  for (size_t i = 0; i < 5; ++i)
  {
    v.push_back(i);
  }
  cout << "size:" << v.size() << endl;
  cout << "capacity:" << v.capacity() << endl;
}


运行结果为:

08c466b53aff4e19e516b8498ad2e6d5.png

2.容量修改

1. reserve

9f0cb5141c509db22d18d2da90fcb070.png

扩大vector的容量到n,如果原来vector的容量大于等于n,不做任何操作

void Test_Capacity2()
{
  vector<int> v(5, 1);
  cout << "before reserve capacity:" << v.capacity() << endl;
  v.reserve(10);
  cout << "after reserve capacity:" << v.capacity() << endl;
}


5229cf7042780c39066a2776e95a4d88.png

2. resize

a3264fd7a1c4765fb82bb00e20d9b801.png

修改vector中的数据个数,如果n小于size,那就修改size;如果n大于size但是小于capacity,那就尾插数据直到size==n,如果n大于capacity,那就先扩容到n,再填充数据。

void Test_Capacity3()
{
  vector<int> v(5, 1);
  cout << "before resize capacity:" << v.size() << endl;
  v.resize(10);
  cout << "after resize capacity:" << v.size() << endl;
  for (auto e : v)
  {
    cout << e << " ";
  }
  cout << endl;
}


fc6a519a55243fc39da9275bdb813335.png

相关文章
|
3月前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
30天前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
20 1
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
61 6
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
52 7
|
1月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
1月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
48 3
|
1月前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
1月前
|
编译器 Linux C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(二)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
1月前
|
编译器 C++ 容器
【C++】C++ STL探索:Vector使用与背后底层逻辑(一)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
1月前
|
算法 C++ 容器
C++之打造my vector篇(下)
C++之打造my vector篇(下)
26 0