C++之容器类有趣的实验(二百四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之向容器中添加nullptr空指针,容器size()会增大吗?为什么?

通过C++的20个容器类进行实验,看看有什么结果?

2.C++ 容器类介绍

C++提供了多种容器,以下是常用的20个容器及其举例:

  1. 数组 (array):固定大小的连续存储空间。例如:int numbers[5] = {1, 2, 3, 4, 5}。

  2. 向量 (vector):可变大小的动态数组。例如:vector numbers = {1, 2, 3, 4, 5}。

  3. 列表 (list):双向链表。例如:list numbers = {1, 2, 3, 4, 5}。

  4. 堆栈 (stack):后进先出 (LIFO) 的数据结构。例如:stack numbers; numbers.push(1); numbers.push(2);。

  5. 队列 (queue):先进先出 (FIFO) 的数据结构。例如:queue numbers; numbers.push(1); numbers.push(2);。

  6. 双端队列 (deque):两端都可以进行插入和删除操作的队列。例如:deque numbers = {1, 2, 3, 4, 5}。

  7. 集合 (set):不重复元素的无序集合。例如:set numbers = {1, 2, 3, 4, 5}。

  8. 映射 (map):键-值对的集合,根据键进行查找。例如:map studentScores = {{“Alice”, 90}, {“Bob”, 85}}。

  9. 哈希表 (unordered_map):基于哈希函数实现的映射容器。例如:unordered_map studentScores = {{“Alice”, 90}, {“Bob”, 85}}。

  10. 树 (tree):一种层次结构,如二叉搜索树 (binary search tree) 或红黑树 (red-black tree)。例如:BST树。

  11. 堆 (heap):一种优先级队列,按照特定规则进行元素的插入和删除。例如:priority_queue numbers; numbers.push(1); numbers.push(2);。

  12. 栈 (array-based stack):基于数组的栈实现。例如:stack numbers; numbers.push(1); numbers.push(2);。

  13. 单向链表 (forward_list):单向链表的容器。例如:forward_list numbers = {1, 2, 3, 4, 5}。

  14. 多重集合 (multiset):允许重复元素的集合。例如:multiset numbers = {1, 2, 2, 3, 4, 4, 4}。

  15. 多重映射 (multimap):允许重复键的映射容器。例如:multimap studentScores = {{“Alice”, 90}, {“Bob”, 85}, {“Alice”, 95}}。

  16. 哈希集合 (unordered_set):基于哈希函数实现的集合容器。例如:unordered_set numbers = {1, 2, 3, 4, 5}。

  17. 字符串 (string):字符串容器。例如:string str = “Hello, world!”。

  18. 位集合 (bitset):固定大小的位集合容器。例如:bitset<8> bits = 8;。

  19. 链式哈希集合 (unordered_multiset):基于哈希函数实现的允许重复元素的集合容器。例如:unordered_multiset numbers = {1, 2, 2, 3, 4, 4, 4}。

  20. 链式哈希映射 (unordered_multimap):基于哈希函数实现的允许重复键的映射容器。例如:unordered_multimap studentScores = {{“Alice”, 90}, {“Bob”, 85}, {“Alice”, 95}}。

3.实例

v1.0

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main() {

  // array
  array<int*, 5> arr = {nullptr};
  cout << "Array size: " << arr.size() << endl;

  // vector
  vector<int*> vec;
  cout << "Vector size: " << vec.size() << endl;
  vec.push_back(nullptr);
  cout << "Vector size: " << vec.size() << endl;

  // list
  list<int*> lis;
  cout << "List size: " << lis.size() << endl;
  lis.push_back(nullptr);
  cout << "List size: " << lis.size() << endl;

  // stack
  stack<int*> sta;
  cout << "Stack size: " << sta.size() << endl;
  sta.push(nullptr);
  cout << "Stack size: " << sta.size() << endl;

  // queue
  queue<int*> que;
  cout << "Queue size: " << que.size() << endl;
  que.push(nullptr);
  cout << "Queue size: " << que.size() << endl;

  // deque
  deque<int*> deq;
  cout << "Deque size: " << deq.size() << endl;
  deq.push_back(nullptr);
  cout << "Deque size: " << deq.size() << endl;

  // set
  set<int*> se;
  cout << "Set size: " << se.size() << endl;
  se.insert(nullptr);
  cout << "Set size: " << se.size() << endl;

  // map
  map<int*, int> ma;
  cout << "Map size: " << ma.size() << endl;
  ma[nullptr] = 0;
  cout << "Map size: " << ma.size() << endl;

  // unordered_map
  unordered_map<int*, int> ump;
  cout << "Unordered Map size: " << ump.size() << endl;
  ump[nullptr] = 0;
  cout << "Unordered Map size: " << ump.size() << endl;

  // array-based stack
  stack<int*, vector<int*>> abs;
  cout << "Array-based Stack size: " << abs.size() << endl;
  abs.push(nullptr);
  cout << "Array-based Stack size: " << abs.size() << endl;

  // forward_list
  forward_list<int*> flis;
  cout << "Forward List size: " << distance(flis.begin(), flis.end()) << endl;
  flis.push_front(nullptr);
  cout << "Forward List size: " << distance(flis.begin(), flis.end()) << endl;

  // multiset  
  multiset<int*> mse;
  cout << "Multiset size: " << mse.size() << endl;
  mse.insert(nullptr);
  cout << "Multiset size: " << mse.size() << endl;

  // multimap
  multimap<int*, int> mmap;
  cout << "Multimap size: " << mmap.size() << endl;
  mmap.insert({nullptr, 0});
  cout << "Multimap size: " << mmap.size() << endl;

  // unordered_set
  unordered_set<int*> use;
  cout << "Unordered Set size: " << use.size() << endl;
  use.insert(nullptr);
  cout << "Unordered Set size: " << use.size() << endl;

  // string
  string str;
  cout << "String size: " << str.size() << endl;
  str.push_back('\0');
  cout << "String size: " << str.size() << endl;

  // bitset
  bitset<1> bits;
  cout << "Bitset size: " << bits.size() << endl;
  bits[0] = 0;
  cout << "Bitset size: " << bits.size() << endl;

  // unordered_multiset
  unordered_multiset<int*> umse;
  cout << "Unordered Multiset size: " << umse.size() << endl;
  umse.insert(nullptr);
  cout << "Unordered Multiset size: " << umse.size() << endl;

  // unordered_multimap
  unordered_multimap<int*, int> ummap;
  cout << "Unordered Multimap size: " << ummap.size() << endl;
  ummap.insert({nullptr, 0});
  cout << "Unordered Multimap size: " << ummap.size() << endl;

  return 0;
}

打印结果:
Array size: 5
Vector size: 0
Vector size: 1
List size: 0
List size: 1
Stack size: 0
Stack size: 1
Queue size: 0
Queue size: 1
Deque size: 0
Deque size: 1
Set size: 0
Set size: 1
Map size: 0
Map size: 1
Unordered Map size: 0
Unordered Map size: 1
Array-based Stack size: 0
Array-based Stack size: 1
Forward List size: 0
Forward List size: 1
Multiset size: 0
Multiset size: 1
Multimap size: 0
Multimap size: 1
Unordered Set size: 0
Unordered Set size: 1
String size: 0
String size: 1
Bitset size: 1
Bitset size: 1
Unordered Multiset size: 0
Unordered Multiset size: 1
Unordered Multimap size: 0
Unordered Multimap size: 1

v2.0

#include 
#include 
#include 

int main() {
  std::vector<std::string*> buf;
  printf("size = %ld\n",buf.size());
  buf.push_back(nullptr);
  printf("size = %ld\n",buf.size());
  return 0;
}

打印结果:
size = 0
size = 1

4.实验结果

<1>.当将 nullptr 添加到 std::vectorstd::string* 中时,实际上是将一个空指针的地址添加到了容器中,并不是将空指针本身存储到容器中。

<2>.在这种情况下,使用 buf.push_back(nullptr) 是合法的,因为 std::vectorstd::string* 可以存储指针类型的元素。所以在执行完 buf.push_back(nullptr) 后,容器中会存储一个空指针的地址。

<3>.因此,当你打印 buf.size() 时,结果为 1,表示容器中有一个元素,即空指针。

<4>.注意,虽然空指针本身不占用任何内存空间,但是指针的地址存储在容器中占用了一个元素的位置

你可能感兴趣的:(C++入门系列,c++,开发语言)