📜  C++中的前向列表和无序映射列表及示例(1)

📅  最后修改于: 2023-12-03 15:14:03.404000             🧑  作者: Mango

C++中的前向列表和无序映射列表

C++标准模板库(STL)中提供了许多容器类,包括向量(vector)、列表(list)、映射(map)等。前向列表(forward_list)是一个单项列表,它比标准的列表更加轻便、省空间。无序映射列表(unordered_map)是一个关联容器,它提供了键值对的存储及快速查找功能。

前向列表(forward_list)

前向列表是一种单向列表,每个节点只保存下一个节点的地址,相对于标准的列表,前向列表更加轻便、省空间。前向列表中的元素不能直接访问,需要通过迭代器遍历整个列表。前向列表的基本操作包括插入元素、删除元素、访问元素和遍历元素等。

创建前向列表
#include <forward_list>
#include <iostream>
using namespace std;

int main() {
  forward_list<int> mylist;     // 创建前向列表
  mylist.push_front(1);         // 在列表头部插入元素1
  mylist.push_front(2);         // 在列表头部插入元素2
  mylist.push_front(3);         // 在列表头部插入元素3

  cout << "前向列表的元素:" << endl;
  for (auto it = mylist.begin(); it != mylist.end(); it++) {
    cout << *it << " ";
  }
  return 0;
}

输出结果:

前向列表的元素:
3 2 1
插入元素

使用 insert_after() 函数可以向前向列表中插入一个元素,在指定节点之后插入。

#include <forward_list>
#include <iostream>
using namespace std;

int main() {
  forward_list<int> mylist;     // 创建前向列表 
  auto it = mylist.before_begin(); // 获取第一个节点之前的位置

  mylist.insert_after(it, 1);   // 在第一个节点之后插入元素1
  mylist.insert_after(it, 2);   // 在第一个节点之后插入元素2
  mylist.insert_after(it, 3);   // 在第一个节点之后插入元素3

  cout << "前向列表的元素:" << endl;
  for (auto it = mylist.begin(); it != mylist.end(); it++) {
    cout << *it << " ";
  }
  return 0;
}

输出结果:

前向列表的元素:
3 2 1
删除元素

使用 erase_after() 函数可以删除前向列表中的一个元素,在指定节点之后删除。

#include <forward_list>
#include <iostream>
using namespace std;

int main() {
  forward_list<int> mylist;     // 创建前向列表 
  auto it = mylist.before_begin(); // 获取第一个节点之前的位置

  mylist.insert_after(it, 1);   // 在第一个节点之后插入元素1
  mylist.insert_after(it, 2);   // 在第一个节点之后插入元素2
  mylist.insert_after(it, 3);   // 在第一个节点之后插入元素3

  mylist.erase_after(it);       // 删除第一个节点之后的元素

  cout << "前向列表的元素:" << endl;
  for (auto it = mylist.begin(); it != mylist.end(); it++) {
    cout << *it << " ";
  }
  return 0;
}

输出结果:

前向列表的元素:
2 1
无序映射列表(unordered_map)

无序映射列表是一个关联容器,它提供了键值对的存储及快速查找功能。无序映射列表的元素以键值对的形式出现,每个键值对包括一个键和一个值,键和值都可以是任意类型的。

创建无序映射列表

使用 unordered_map 类模板可以创建一个无序映射列表,模板参数分别为键类型和值类型。

#include <unordered_map>
#include <iostream>
using namespace std;

int main() {
  unordered_map<int, string> mymap;  // 创建无序映射列表
  mymap[1] = "one";                  // 添加键值对
  mymap[2] = "two";
  mymap[3] = "three";

  cout << "无序映射列表的元素:" << endl;
  for (auto it = mymap.begin(); it != mymap.end(); it++) {
    cout << it->first << ":" << it->second << endl;
  }
  return 0;
}

输出结果:

无序映射列表的元素:
3:three
1:one
2:two
插入元素

使用 insert() 函数可以向无序映射列表中插入一个元素。

#include <unordered_map>
#include <iostream>
using namespace std;

int main() {
  unordered_map<int, string> mymap;  // 创建无序映射列表
  mymap.insert(make_pair(1, "one")); // 添加键值对
  mymap.insert(make_pair(2, "two"));
  mymap.insert(make_pair(3, "three"));

  cout << "无序映射列表的元素:" << endl;
  for (auto it = mymap.begin(); it != mymap.end(); it++) {
    cout << it->first << ":" << it->second << endl;
  }
  return 0;
}

输出结果:

无序映射列表的元素:
3:three
1:one
2:two
删除元素

使用 erase() 函数可以删除无序映射列表中的一个元素,需要指定键值。

#include <unordered_map>
#include <iostream>
using namespace std;

int main() {
  unordered_map<int, string> mymap;  // 创建无序映射列表
  mymap.insert(make_pair(1, "one")); // 添加键值对
  mymap.insert(make_pair(2, "two"));
  mymap.insert(make_pair(3, "three"));

  mymap.erase(2);                   // 删除键为2的元素

  cout << "无序映射列表的元素:" << endl;
  for (auto it = mymap.begin(); it != mymap.end(); it++) {
    cout << it->first << ":" << it->second << endl;
  }
  return 0;
}

输出结果:

无序映射列表的元素:
3:three
1:one