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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:56:36