如何正确向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
相关产品推荐
相关产品推荐

