如何将std::map中的内容复制到指针列表中?
嘿,我来帮你解决这个问题!你需要把std::map<CTurist, unsigned>的内容复制到指针列表里,我会分两种常见场景给你具体的实现方案,你可以根据自己的需求来选:
场景1:存储指向map原有元素的指针
如果你的指针列表不需要脱离原map的生命周期(原map会一直存在,直到指针列表不再使用),可以直接存储map中元素的指针。std::map的元素是std::pair<const CTurist, unsigned>类型,我们可以用std::vector来存放这些元素的指针:
#include <map> #include <vector> #include <iostream> #include <fstream> #include <string> using namespace std; // 你的CTurist类定义,补全流操作符实现 class CTurist { protected: string tName; int age; public: CTurist() {}; CTurist(string name, int age2) : tName(name), age(age2) {} bool operator<(const CTurist& e) const { return age < e.age; } friend ostream& operator<<(ostream& os, const CTurist&& e); friend ifstream& operator>>(ifstream& is, CTurist&& e); }; ostream& operator<<(ostream& os, const CTurist&& e) { os << e.tName << " (" << e.age << ")"; return os; } ifstream& operator>>(ifstream& is, CTurist&& e) { is >> e.tName >> e.age; return is; } int main() { // 初始化测试用的map std::map<CTurist, unsigned> touristMap; touristMap.emplace(CTurist("Alice", 25), 100); touristMap.emplace(CTurist("Bob", 30), 150); touristMap.emplace(CTurist("Charlie", 22), 80); // 创建指针列表,存储指向map元素的指针 std::vector<const std::pair<CTurist, unsigned>*> ptrList; // 遍历map,填充指针列表 for (const auto& entry : touristMap) { ptrList.push_back(&entry); } // 验证结果 cout << "指针列表内容:" << endl; for (const auto* ptr : ptrList) { cout << "游客:" << std::move(ptr->first) << ",对应值:" << ptr->second << endl; } return 0; }
注意点:
- map的键是
const类型(保证有序性不被破坏),所以指针类型是const std::pair<CTurist, unsigned>*,不能通过指针修改键的值。 - 这种方式不会复制元素,只是复用原map的内存,所以原map的生命周期必须长于指针列表。
场景2:复制元素到新对象,存储新对象的指针
如果指针列表需要独立于原map存在(比如原map会被提前销毁),那需要把map中的元素复制到新对象里,再存储这些新对象的指针。推荐用智能指针管理内存,避免手动释放的麻烦:
#include <map> #include <vector> #include <iostream> #include <fstream> #include <string> #include <memory> #include <utility> using namespace std; // 同样的CTurist类定义(可把流操作符改成左值引用版本更通用) class CTurist { protected: string tName; int age; public: CTurist() {}; CTurist(string name, int age2) : tName(name), age(age2) {} bool operator<(const CTurist& e) const { return age < e.age; } // 建议改成左值引用版本的流操作符,使用更方便 friend ostream& operator<<(ostream& os, const CTurist& e); friend ifstream& operator>>(ifstream& is, CTurist& e); }; ostream& operator<<(ostream& os, const CTurist& e) { os << e.tName << " (" << e.age << ")"; return os; } ifstream& operator>>(ifstream& is, CTurist& e) { is >> e.tName >> e.age; return is; } int main() { std::map<CTurist, unsigned> touristMap; touristMap.emplace(CTurist("Alice", 25), 100); touristMap.emplace(CTurist("Bob", 30), 150); touristMap.emplace(CTurist("Charlie", 22), 80); // 用unique_ptr的vector存储新对象的指针,自动管理内存 std::vector<std::unique_ptr<std::pair<CTurist, unsigned>>> ptrList; // 复制map元素到新对象,加入指针列表 for (const auto& entry : touristMap) { ptrList.push_back(std::make_unique<std::pair<CTurist, unsigned>>(entry)); } // 验证结果 cout << "独立指针列表内容:" << endl; for (const auto& ptr : ptrList) { cout << "游客:" << ptr->first << ",对应值:" << ptr->second << endl; } // 无需手动delete,unique_ptr会自动释放内存 return 0; }
优化建议:
- 把
CTurist的流操作符改成接受const CTurist&的版本,这样就不用每次都用std::move转换右值,代码更简洁通用。
内容的提问来源于stack exchange,提问作者TimothyY
相关产品推荐
相关产品推荐

