一)容器嵌套的概念
在 C++ 中,容器嵌套是指将一种容器类型作为另一种容器的元素。这允许创建更复杂的数据结构,以满足各种编程需求。例如,可以将一个vector容器放入另一个vector容器中,或者将一个map容器的元素设置为list容器等。
常见的容器嵌套方式及示例
1)vector嵌套vector(二维数组类似结构)
示例代码:
#include <iostream>
#include <vector>
int main()
{
// 创建一个二维vector,相当于一个矩阵
std::vector<std::vector<int>> matrix;
// 初始化一个3x3的矩阵
matrix.resize(3);
for (int i = 0; i < 3; ++i)
{
matrix[i].resize(3);
}
// 填充矩阵元素
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
matrix[i][j] = i * 3 + j;
}
}
// 输出矩阵元素
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
解释:
首先创建了一个std::vector<std::vector>类型的对象matrix,它是一个嵌套的vector,外层vector可以看作是行,内层vector看作是列。通过resize方法初始化了一个 3x3 的矩阵结构,然后使用嵌套的循环填充矩阵元素,最后再使用嵌套循环输出矩阵元素。这种结构类似于二维数组,但具有动态大小的优点,可以方便地添加或删除行和列。
2)map嵌套vector(关联容器与序列容器组合)
示例代码:
#include <iostream>
#include <map>
#include <vector>
int main()
{
// 创建一个map,键为整数,值为vector<int>
std::map<int, std::vector<int>> myMap;
// 向map中添加元素,每个键对应一个vector
myMap[1].push_back(10);
myMap[1].push_back(20);
myMap[2].push_back(30);
// 遍历map
for (auto it = myMap.begin(); it!= myMap.end(); ++it)
{
std::cout << "Key: " << it->first << ", Values: ";
for (int val : it->second)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
return 0;
}
解释:
定义了一个std::map<int, std::vector>类型的对象myMap,它的键是整数类型,值是vector类型。通过myMap[1].push_back(10)这种方式,先根据键获取对应的vector(如果键不存在,会自动创建一个空的vector),然后向vector中添加元素。在遍历map时,通过迭代器it获取键it->first和值(vector)it->second,再遍历vector输出其中的元素,这种结构可以用于根据某个键来关联一组数据,比如可以根据学生的学号(键)来关联该学生的成绩列表(vector值)。
3)set嵌套map(复杂关联结构)
示例代码:
#include <iostream>
#include <set>
#include <map>
int main()
{
// 创建一个set,其中的元素是map<int, int>
std::set<std::map<int, int>> mySet;
// 创建一个map元素添加到set中
std::map<int, int> myMap1;
myMap1[1] = 10;
myMap1[2] = 20;
mySet.insert(myMap1);
// 遍历set中的map元素
for (auto itSet = mySet.begin(); itSet!= mySet.end(); ++itSet)
{
for (auto itMap = (*itSet).begin(); itMap!= (*itSet).end(); ++itMap)
{
std::cout << "Key: " << itMap->first << ", Value: " << itMap->second << " ";
}
std::cout << std::endl;
}
return 0;
}
解释:
这里定义了一个std::set<std::map<int, int>>类型的对象mySet,它的元素是map<int, int>类型。首先创建一个map对象myMap1并填充元素,然后将其插入到set中。在遍历set中的map元素时,需要使用两层嵌套的迭代器。外层迭代器itSet用于遍历set,内层迭代器itMap用于遍历set中的每个map元素。这种嵌套结构可以用于存储和处理一组具有相同键 - 值对结构的关联数据集合,并且利用set的特性来保证这些map元素的唯一性(根据map的比较规则来确定唯一性)。
二)容器嵌套的应用场景
数据存储和表示复杂关系:
在处理具有层次结构的数据时非常有用。例如,在一个组织结构图中,可以使用vector嵌套vector来表示部门和员工的关系,外层vector表示部门,每个部门对应的内层vector表示该部门的员工。
实现图数据结构:
对于图这种数据结构,可以使用vector嵌套vector来实现邻接表表示法。例如,graph[i]表示与节点i相邻的节点列表,通过这种方式可以方便地存储和处理图的相关信息,如广度优先搜索、深度优先搜索等算法。
管理多组关联数据:
如在一个学校成绩管理系统中,map嵌套vector可以用于存储每个班级(键)的学生成绩列表(值),方便对每个班级的成绩进行统计和分析。