如何用std::transform将std::vector转换为索引为键的std::map
解决方案
方法一:使用std::transform结合插入迭代器
通过std::transform遍历vector元素,手动维护索引变量,将索引与元素组成键值对插入map:
#include <vector> #include <map> #include <algorithm> #include <iterator> #include <iostream> int main() { std::vector<std::string> vec { "abc", "xyz", "pqr" }; std::map<int, std::string> m; int index = 0; std::transform(vec.begin(), vec.end(), std::inserter(m, m.end()), [&index](const std::string& s) { return std::make_pair(index++, s); }); // 输出验证 for (const auto& pair : m) { std::cout << pair.first << " -> \"" << pair.second << "\"\n"; } return 0; }
方法二:C++20 范围版std::transform(更简洁)
利用C++20范围库的std::views::enumerate直接获取元素索引,无需手动维护计数器:
#include <vector> #include <map> #include <algorithm> #include <ranges> #include <iterator> #include <iostream> int main() { std::vector<std::string> vec { "abc", "xyz", "pqr" }; std::map<int, std::string> m; std::ranges::transform(vec | std::views::enumerate, std::inserter(m, m.end()), [](const auto& elem) { return std::make_pair(static_cast<int>(elem.index), elem.value); }); // 输出验证 for (const auto& pair : m) { std::cout << pair.first << " -> \"" << pair.second << "\"\n"; } return 0; }
方法三:手动迭代(等价替代方案)
如果不需要拘泥于std::transform,手动循环的方式逻辑更直观,兼容所有C++版本:
#include <vector> #include <map> #include <iostream> int main() { std::vector<std::string> vec { "abc", "xyz", "pqr" }; std::map<int, std::string> m; for (int i = 0; i < vec.size(); ++i) { m[i] = vec[i]; } // 输出验证 for (const auto& pair : m) { std::cout << pair.first << " -> \"" << pair.second << "\"\n"; } return 0; }
内容的提问来源于stack exchange,提问作者user1408865
相关产品推荐
相关产品推荐

