6.1 C++ STL 序列映射容器

c++,stl,序列,映射,容器 · 浏览次数 : 10

小编点评

```cpp #include #include #include using namespace std; struct StudentInfo { char *name; int year; char *addr; }; struct StudentRecord { int id; StudentInfo stu; }; int main() { // 创建学生信息数组 StudentRecord szArray[] = { { 1, "admin0", 22, "beijing" }, { 2, "admin1", 33, "shanghai" }, { 3, "admin2", 24, "jinan" }, }; // 创建Map映射 map mp; // 初始化,将学生数组装入映射 for (int x = 0; x < 3; x++) mp[szArray[x].id] = szArray[x].stu; // 迭代遍历Map中所有的数据 map::iterator start, end; end = mp.end(); for (start = mp.begin(); start != end; start++) cout << start->first << " -- " << start->second.name << endl; // 迭代寻找mp.find(1) 元素,并打印出其内部成员 map::iterator i = mp.find(1); if (i != mp.end()) { cout << "Name: " << i->second.name << endl; } // 实现员工分组 SetGroup(v, mp); // 实现员工分组 ShowGroup(mp); return 0; } ``` ```排版 ``` Group: Name: admin0 Name: admin1 Name: admin2 Name: admin0 Name: admin1 Name: admin2 ```

正文

Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap声明映射容器,则同样可以插入相同的键值。

Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个Pair同时拥有实值和键值,Pair的第一个元素被视为键值,第二个元素则被视为实值,Map 容器中不允许两个元素有相同的键出现。

6.1 通过对组实现键值对

这段代码演示了C++中标准库中pairset的用法。pair是一个用来存储一对值的数据类型,可以用来表示关联数组或者键值对。set是一个用来存储不重复元素的集合,其内部自动对元素进行排序,具体排序方式由元素类型的比较函数定义。

代码中首先创建了两个pair对象p和p2,分别用stringint类型的值进行初始化。接着创建了一个set对象var,用来存储int类型的元素。由于set中不能存在重复的元素,所以在插入元素10时,因为之前已经插入过10,所以插入失败,返回了一个pair对象,其中second为false,表示插入失败。最后程序暂停等待用户操作,防止程序退出。

#include <iostream>
#include <set>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{   // 创建的对组字符串
  pair<string, int> p(string("lyshark"), 100);
  pair<string, int> p2 = make_pair("jerry", 200);
  cout << "Name: " << p.first << endl;
  cout << "Age: " << p.second << endl;

  // 检测集合元素是存在重复的,如果出现重复的则报错
  set<int> var;
  var.insert(10);  // 由于插入过10这个元素,所以在此插入则会报错
  pair<set<int>::iterator, bool> ret = var.insert(10);
  if (!ret.second)
    cout << "insert error" << endl;

  system("pause");
  return 0;
}

6.2 正反向遍历映射容器

这段代码演示了如何使用C++ STL中的map容器,其中包括了map的插入、删除、正向遍历、反向遍历等常用操作。其中,map是一种键值对映射容器,通过key可以快速查找value。本代码中使用了三种方式实现了map容器的插入操作,分别是insert函数、make_pair函数、数组形式。在插入之后,使用erase函数删除了其中的一个键值对。正向遍历和反向遍历分别使用了map的迭代器和反向迭代器。

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
  map<string, int> mp;
  // 三种方式实现map容器插入操作
  mp.insert(pair<string, int>("admin0", 100));
  mp.insert(make_pair("admin1", 200));
  mp["admin2"] = 300;

  mp.erase("admin2");    // 删除第3个数据

  // 正向遍历键值对
  for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++)
    cout << "key = " << it->first << " --> value = " << it->second << endl;

  cout << endl;
  // 反向遍历键值对
  for (map<string, int>::reverse_iterator it = mp.rbegin(); it != mp.rend();it ++)
    cout << "key = " << it->first << " --> value = " << it->second << endl;
  system("pause");
  return 0;
}

6.3 查找映射容器中的元素

这段代码实现了使用STL库中的map类型来存储一组键值对,其中键是字符串类型,值是整数类型。代码中演示了如何使用map的findlower_boundupper_bound方法来查找指定的键值对,分别返回该元素的迭代器、第一个大于等于该元素的迭代器和第一个大于该元素的迭代器。

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
  map<string, int> mp;

  mp["admin0"] = 100;
  mp["admin1"] = 200;
  mp["admin2"] = 300;
  
  // 寻找admin0是否存在于键值对中
  map<string, int>::iterator pos = mp.find("admin0");
  if (pos != mp.end())
    cout << "key = " << pos->first << " --> value = " << pos->second << endl;

  // lower_bound(keyElem) 返回第一个key=keyElem元素的迭代器
  map<string, int>::iterator ret = mp.lower_bound("admin0");
  if (ret != mp.end())
    cout << "lower_bound key = " << ret->first << " --> lower_bound value = " << ret->second << endl;
  
  // upper_bound(keyElem) 返回第一个key>keyElem元素的迭代器
  map<string, int>::iterator ret1 = mp.upper_bound("admin0");
  cout << "upper_bound key = " << ret1->first << " --> upper_bound value = " << ret1->second << endl;
  system("pause");
  return 0;
}

6.4 遍历映射容器中的结构

这段代码是一个使用STL的map容器存储学生信息的示例程序,其中使用了结构体来存储学生信息。在主函数中,首先将三个学生信息存储到一个StudentRecord数组中,然后通过将这些学生信息放入map容器中,实现将学生信息与其对应的ID关联起来。接着,通过迭代器遍历整个map容器,将每个学生的ID和姓名输出到屏幕上。最后,通过使用map容器的find方法,查找学生ID为1的学生信息,并将其姓名输出到屏幕上。

#include <iostream>
#include <map>
#include <string>

using namespace std;

struct StudentInfo{
  char *name;
  int year;
  char *addr;
};

struct StudentRecord{
  int id;
  StudentInfo stu;
};

int main(int argc, char* argv[])
{
  StudentRecord szArray[] = {
    { 1, "admin0", 22, "beijing" },
    { 2, "admin1", 33, "shanghai" },
    { 3, "admin2", 24, "jinan" },
  };
  // 创建Map映射
  map<int, StudentInfo> mp;

  // 初始化,将学生数组装入映射
  for (int x = 0; x < 3; x++)
  {
    mp[szArray[x].id] = szArray[x].stu;
  }
  // 迭代遍历Map中所有的数据
  map<int, StudentInfo>::iterator start, end;
  end = mp.end();
  for (start = mp.begin(); start != end; start++)
    cout << "ID: " << (*start).first << " --> Name: " << (*start).second.name << endl;

  // 迭代寻找mp.find(1) 元素,并打印出其内部成员
  map<int, StudentInfo>::iterator i = mp.find(1);
  cout << "First: " << (*i).first << endl;
  cout << "Name: " << (*i).second.name << endl;
  system("pause");
  return 0;
}

6.5 通过映射容器实现分组

这段代码是一个员工分组的示例程序,通过随机生成5个员工成员,然后随机将这些员工分到三个部门中(人力、研发、美术),最后输出人力部门的员工名单。它使用了 vector存储员工信息,使用multimap存储分组信息,通过枚举类型和常量来定义部门编号,实现了分组和展示分组的功能。

#include <iostream>
#include <vector>
#include <string>
#include <map>

using namespace std;

enum {RENLI,YANFA,MEISHU};  // 定义三个部门 RENLI=0
class Worker
{
public:
  string m_name;
  int m_money;
};
// 随机生成5个员工成员
void CreateWorker(vector<Worker> &v)
{
  string nameSeed = "ABCDE";
  Worker w;
  for (int x = 0; x < 5; x++)
  {
    string name;
    name += nameSeed[x];
    int money = rand() % 10000+10000;
    w.m_name = name;
    w.m_money = money;
    v.push_back(w);
  }
}
// 打印出指定的部门信息,查其他分组只需修改RENLI为其他即可
void ShowGroup(multimap<int, Worker> &m)
{
  cout << "Group:" << endl;
  multimap<int,Worker>::iterator pos = m.find(RENLI);
  int index = 0;            // 计数器每次递增,直到等于num
  int num = m.count(RENLI); // 人力部门有多少调数据
  for (; pos != m.end(), index < num; pos++, index++)
  {
    cout << "Name: " << pos->second.m_name << endl;
  }
}
// 实现员工分组
void SetGroup(vector<Worker> &v,multimap<int,Worker> & m)
{
  for (vector<Worker>::iterator it = v.begin(); it != v.end(); it++)
  {
    // 随机的产生一个部门编号
    int departmentId = rand() % 3;
    // 将员工分到multimap容器中, 1=mp
    m.insert(make_pair(departmentId, *(it)));
  }
}
int main(int argc, char* argv[])
{
  vector<Worker> v;
  CreateWorker(v);
  // 实现员工分组,分组的multimap容器
  multimap<int, Worker> mp;
  SetGroup(v,mp);     // 实现员工分组
  ShowGroup(mp);      // 显示分组信息

  system("pause");
  return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/1efdd548.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

与6.1 C++ STL 序列映射容器相似的内容:

6.1 C++ STL 序列映射容器

Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用`Multimap`声明映射容器,则同样可以插入相同的键值。Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个`Pair`同时拥有实值和键值,Pair的第一个元素被视为键值,第二个元素则被视为实值,Map 容器中不允许两个元素有相

6.1 C/C++ 封装字符串操作

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

3.1 C/C++ 使用字符与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

.NET周刊【6月第1期 2024-06-02】

国内文章 一文带你了解.NET能做什么? https://www.cnblogs.com/Can-daydayup/p/18214473 .NET是一个免费、开源、跨平台的开发平台框架,广泛应用于桌面、Web、移动、云服务、游戏、物联网、大数据和人工智能等领域开发。它支持C#、Visual Basi

[转帖]echo 输出不换行-e \c

http://www.my889.com/i/1952 在shell中,echo输出会自动换行。有时候在循环中不希望echo输出换行。代码实现如下: 1 echo -e " \c" # -e 表示开启转义, \c表示不换行 脚本: 1 2 3 4 5 6 7 8 9 #!/bin/bash i=1

.NET周刊【6月第4期 2024-06-23】

国内文章 C#.Net筑基-集合知识全解 https://www.cnblogs.com/anding/p/18229596 .Net中提供了数组、列表、字典等多种集合类型,分为泛型和非泛型集合。泛型集合具有更好的性能和类型安全性。集合的基础接口包括IEnumerator、IEnumerable、I

Lua热更学习--使用toLua中的协程

[6] C#访问调table类中的成员变量和函数 访问table中的变量和函数 lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和function的获取调用,这里尝试获取调用。 依然是如此,此种调用方式获取到的table中的函数是引用拷贝。

4.6 C++ Boost 函数绑定回调库

Boost库中提供了函数对象库,可以轻松地把函数的参数和返回值进行绑定,并用于回调函数。这个库的核心就是bind函数和function类。bind函数可以将一个函数或函数对象和其参数进行绑定,返回一个新的函数对象。通过这个新的函数对象,我们就可以将原有的函数或函数对象当做参数传来传去,并可以传递附加的参数,方便实现参数绑定和回调函数。function类用于表示一种特定的函数签名,可以在不知道具体函

C# 模式匹配

C# 模式匹配 https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/ https://www.codeproject.com/Articles/5368148/Your-Quick-Guide-to-Pattern-Matching-i

.NET周刊【6月第2期 2024-06-09】

国内文章 C#开源实用的工具类库,集成超过1000多种扩展方法 https://www.cnblogs.com/Can-daydayup/p/18230586 文章介绍了一个免费的C#工具类库Z.ExtensionMethods,可以通过NuGet包管理器轻松集成。该库支持.NET Standard