vc++6.0使用map

在vc++6.0中使用不了嵌套的map,也使用不了unordered_map,
如下

unordered_map<string, unordered_map<string, string>> oldIniMap
map<string, map<string, string>> oldIniMap

请问有什么方法能够代替嵌套map的作用,或者说vc++6.0怎样才能使用嵌套的map

  • 文章:vc使用map文件查找程序崩溃原因 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: C++面试高频知识点(一)中的 6.map与unordered_map 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. map
      • 是关联式容器,所有的元素都会根据元素的key值被排序。map的元素是pair,即拥有key值和value值,
      • 由于红黑树是一种平衡二叉树,自动排序效果很不错,故map以红黑树为底层结构,保证了一个较为稳定的动态操作时间,查询、插入,删除都是O(log n)
    2. unordered_map
      • 是关联式容器(无序容器),元素是pair,即拥有key值和value值。
      • 底层结构是哈希表,查询时间是O(1)

    未完待续…

  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    在vc++6.0中,由于其不支持C++11标准,不支持嵌套unordered_map,因此可以考虑使用嵌套map或其他数据结构进行替代。

    例如,可以使用数组来存储嵌套map的内容,或者使用其他的数据结构如vector等。具体使用哪种数据结构,需要根据具体的应用场景来进行选择。

    下面介绍一种使用嵌套map来实现树的最大宽度的方法:

    假设有一个二叉树,现在需要求出其最大宽度。可以使用宽度优先遍历的方法,将每层的节点用map存储,map的key表示节点在该层的位置,value表示该节点本身。

    具体步骤如下:

    1.定义一个队列q,将根节点压入队列中。

    2.定义一个map cur_level,在第一步时,将map的key值设为1,表示该节点在第一层,value值设为根节点。

    3.定义一个变量cur_width,表示当前层的宽度,初始化为1。

    4.从队列头部开始循环,每次取出一个节点,并将其左右子节点压入队列中。

    5.对于每个节点,将其从map中取出,并计算其位置(可在节点结构体中加入一个成员变量来表示该节点在该层的位置),将其插入到新的map next_level中。

    6.当当前节点为该层的最后一个节点时,将当前层的宽度与全局最大宽度cur_max_width比较,更新cur_max_width。

    7.将next_level作为cur_level,重复步骤4-6,直到队列为空。

    8.返回最大宽度cur_max_width。

    代码如下:

    struct Node {
        int val;
        Node* left;
        Node* right;
        int pos;  // 节点在该层的位置
        Node(int v) : val(v), left(NULL), right(NULL), pos(0) {}
    };
    
    int max_width(Node* root) {
        if (root == NULL)
            return 0;
        queue<Node*> q;
        q.push(root);
        map<int,Node*> cur_level;
        cur_level[1] = root;
        int cur_width = 1, cur_max_width = 1;
        while (!q.empty()) {
            Node* cur = q.front();
            q.pop();
            if (cur->left != NULL) {
                cur->left->pos = cur->pos * 2 - 1;
                q.push(cur->left);
                cur_level[cur->left->pos] = cur->left;
            }
            if (cur->right != NULL) {
                cur->right->pos = cur->pos * 2;
                q.push(cur->right);
                cur_level[cur->right->pos] = cur->right;
            }
            if (cur->pos == cur_width) {
                cur_width = (cur_level.rbegin()->first - cur_level.begin()->first) / 2 + 1;
                cur_max_width = max(cur_max_width, cur_width);
                map<int,Node*> next_level;
                cur_level.swap(next_level);
            }
        }
        return cur_max_width;
    }
    

    参考资料:

    1. 杨洋.《算法面试通关40讲》.人民邮电出版社.

    2. http://www.cplusplus.com/reference/unordered_map/unordered_map/

    3. https://hongjingyuan.com/vc++6.0/572118.shtml

在VC++6.0中,不支持STL的一些高级特性,如嵌套的map和unordered_map。但是,你可以使用其他数据结构来代替嵌套的map。

一种替代方法是使用一个单层的map,将多个key组合在一起作为一个key。例如,你可以将两个string类型的key组合成一个pair<string, string>类型的key,然后将其作为map的key,对应的value为一个string类型的值。示例代码如下:


```c
arduino
Copy
typedef pair<string, string> KeyType;
map<KeyType, string> oldIniMap;

// 插入一个值
KeyType key("A", "B");
oldIniMap[key] = "value";

// 查找一个值
KeyType key("A", "B");
string value = oldIniMap[key];

```
另外,如果你需要支持更高级的数据结构,可以使用第三方库,如Boost库。Boost库提供了许多STL没有的高级数据结构,例如multi_index_container、bimap等。但需要注意的是,Boost库需要单独安装,并且需要进行额外的配置和链接。