You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确向std::vector<std::map<int, std::unique_ptr<int>>>容器插入元素?

问题分析与解决方案

原代码编译失败原因

你的容器元素是std::map<int, std::unique_ptr<int>>,但data.emplace_back(std::make_pair(...))试图直接用键值对构造map——std::map并没有接受单个pair的构造函数,因此编译报错。

兼容Visual Studio的修正方案

你修改后的思路是对的,但旧版本Visual Studio对std::map移动语义的支持存在细节问题,可通过以下几种写法解决:

写法1:用初始化列表直接构造单键值对的map

直接通过初始化列表构造包含目标键值对的map,再移动到vector中:

#include <iostream>
#include <map>
#include <vector>
#include <memory>

using namespace std;

int main()
{
    vector<map<int, std::unique_ptr<int>>> data{};

    for (int x = 0; x < 10; x++)
    {
        data.emplace_back(std::map<int, std::unique_ptr<int>>{
            {x, std::make_unique<int>(x)}
        });
    }
}

写法2:在emplace_back内完成map构造与插入

利用lambda在emplace_back的参数中直接完成map的构造和元素插入,确保移动语义被正确触发:

#include <iostream>
#include <map>
#include <vector>
#include <memory>

using namespace std;

int main()
{
    vector<map<int, std::unique_ptr<int>>> data{};

    for (int x = 0; x < 10; x++)
    {
        data.emplace_back([&](){
            std::map<int, std::unique_ptr<int>> m;
            m.emplace(x, std::make_unique<int>(x));
            return std::move(m);
        }());
    }
}

必要配置:启用C++11及以上标准

如果使用旧版Visual Studio,需确保项目启用了C++11或更高标准:

  • 右键项目 → 属性 → 配置属性 → C/C++ → 语言 → C++标准,选择ISO C++11 标准或更高版本。

补充说明

你修改后的代码在在线编译器可用但VS报错,本质是旧版MSVC对std::map移动构造的实现不够完善,上述写法通过显式构造或lambda强制触发移动语义,能规避这类兼容性问题。

内容的提问来源于stack exchange,提问作者Roman Leshchuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:52:19