答案是使用范围for循环或std::transform将map的键值对分别插入vector,前者直观易懂,后者更具函数式风格;对于复杂对象需关注拷贝成本,可考虑智能指针避免深拷贝;除vector外,list、deque、set等容器也可根据访问和修改需求选择。

在C++中,将
std::map
std::vector
map
first
second
vector
要将
std::map
std::vector
map
#include <iostream>
#include <map>
#include <vector>
#include <algorithm> // for std::transform
int main() {
std::map<std::string, int> myMap = {
{"apple", 10},
{"banana", 20},
{"cherry", 30},
{"date", 40}
};
std::vector<std::string> keys;
std::vector<int> values;
// 方法一:使用C++11的范围for循环(推荐)
for (const auto& pair : myMap) {
keys.push_back(pair.first);
values.push_back(pair.second);
}
// 打印结果验证
std::cout << "Keys (Method 1): ";
for (const auto& key : keys) {
std::cout << key << " ";
}
std::cout << std::endl;
std::cout << "Values (Method 1): ";
for (const auto& value : values) {
std::cout << value << " ";
}
std::cout << std::endl;
// 清空,以便展示第二种方法
keys.clear();
values.clear();
// 方法二:使用std::transform(更函数式编程风格)
// 提取键
std::transform(myMap.begin(), myMap.end(), std::back_inserter(keys),
[](const auto& pair){ return pair.first; });
// 提取值
std::transform(myMap.begin(), myMap.end(), std::back_inserter(values),
[](const auto& pair){ return pair.second; });
// 打印结果验证
std::cout << "Keys (Method 2): ";
for (const auto& key : keys) {
std::cout << key << " ";
}
std::cout << std::endl;
std::cout << "Values (Method 2): ";
for (const auto& value : values) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}这两种方法各有优势。范围for循环直观易懂,对于初学者友好;而
std::transform
在C++中,将
map
vector
map
std::transform
map
立即学习“C++免费学习笔记(深入)”;
具体到细节,我们需要考虑:
std::map
std::vector
push_back
std::vector::push_back
vector
vector
vector::reserve(myMap.size())
map
push_back
std::move
map
std::string
push_back(std::move(pair.first))
pair
const
const
std::string
总结来说,对于大多数场景,这种提取操作的效率瓶颈不会成为主要问题,除非
map
vector
当
std::map
std::vector
假设我们有一个
Person
#include <string>
#include <utility> // for std::move
struct Person {
std::string name;
int age;
// 默认构造函数
Person() : name(""), age(0) {
// std::cout << "Person default constructed." << std::endl;
}
// 构造函数
Person(std::string n, int a) : name(std::move(n)), age(a) {
// std::cout << "Person constructed: " << name << std::endl;
}
// 拷贝构造函数
Person(const Person& other) : name(other.name), age(other.age) {
// std::cout << "Person copied: " << name << std::endl;
}
// 移动构造函数
Person(Person&& other) noexcept : name(std::move(other.name)), age(other.age) {
// std::cout << "Person moved: " << name << std::endl;
}
// 拷贝赋值运算符
Person& operator=(const Person& other) {
if (this != &other) {
name = other.name;
age = other.age;
}
// std::cout << "Person copy assigned: " << name << std::endl;
return *this;
}
// 移动赋值运算符
Person& operator=(Person&& other) noexcept {
if (this != &other) {
name = std::move(other.name);
age = other.age;
}
// std::cout << "Person move assigned: " << name << std::endl;
return *this;
}
};
// 用于map的比较器,如果Person作为键
bool operator<(const Person& a, const Person& b) {
if (a.name != b.name) {
return a.name < b.name;
}
return a.age < b.age;
}
// 示例map
std::map<int, Person> peopleById = {
{101, {"Alice", 30}},
{102, {"Bob", 25}},
{103, {"Charlie", 35}}
};
std::vector<int> ids;
std::vector<Person> people;
// 提取数据
for (const auto& entry : peopleById) {
ids.push_back(entry.first); // int是基本类型,直接拷贝
people.push_back(entry.second); // Person对象会被拷贝构造
}这里
people.push_back(entry.second);
Person
Person
map
std::map
const std::pair<const Key, Value>&
std::move(entry.second)
entry.second
const
解决方案:
接受拷贝成本:对于大多数情况,如果
Person
存储指针或智能指针:如果对象非常重,并且你希望避免拷贝,一个常见策略是在
map
std::unique_ptr<Person>
std::shared_ptr<Person>
vector
// 假设map存储的是智能指针
std::map<int, std::unique_ptr<Person>> peoplePtrsById;
peoplePtrsById.emplace(101, std::make_unique<Person>("Alice", 30));
// ...
std::vector<std::unique_ptr<Person>> extractedPeoplePtrs;
for (auto& entry : peoplePtrsById) { // 注意这里不再是const auto&,因为要移动
extractedPeoplePtrs.push_back(std::move(entry.second)); // 移动unique_ptr
}
// 此时,peoplePtrsById中的unique_ptr已被移动,变为nullptr这种方式下,
map
map
std::shared_ptr
自定义转换函数:如果对象在提取时需要进行转换或部分提取,
std::transform
通常,对于复杂对象,只要其拷贝构造函数设计合理,直接拷贝到
vector
std::vector
map
std::list
std::list
std::list<KeyType> keys; std::list<ValueType> values;
std::deque
push_front
push_back
pop_front
pop_back
vector
deque
std::deque<KeyType> keys; std::deque<ValueType> values;
std::set
std::unordered_set
map
std::set
std::unordered_set
std::set<KeyType> uniqueKeys;
std::map
std::unordered_map
map
map
std::map<ValueType, KeyType> reverseMap;
选择哪种数据结构,归根结底还是要看你提取出这些键值后,打算如何使用它们。
vector
std::set
std::unordered_set
std::deque
std::list
以上就是如何在C++中将map的键和值分别存入vector_C++ map数据提取方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号