0

我有一个 class Person,它有另一个类的向量Badge(具有唯一的 Id)。要访问向量中的所有元素,我可以遍历元素,这需要 O(n) 时间,n 是向量的大小。我想在恒定时间内完成,所以我创建了一个地图,其中Badgeid 作为键,指针Badge作为值。这里,指针指向向量的一个元素。进一步来说:

class Badge
{
public:
    Badge(string, int);
    const int& getBadgeId() const;
    const string& getBadgeName() const;
    int getRoyaltyPoints() const;
    void setRoyaltyPoints(int royaltyPoints);

private:
    int badgeId;
    string badgeName;
    int royaltyPoints;
    int getUniqueBadgeId();
};

class Person
{
public:
    Person(string);
    const unordered_map<int, Badge*>& getBadgeMap() const;
    const vector<Badge>& getBadges() const;
    const string& getName() const;
    const string& getPersonId() const;
    void addBadge(Badge&);
    void updateRoyalty(Badge&, int);

private:
    string personId;
    string name;
    vector<Badge> badges;
    unordered_map<int, Badge*> badgeMap;
    string getUniquePersonId();
};

涉及的功能:

/* Adds a badge to the badges collection and updates the map */
void Person::addBadge(Badge &badge)
{
    this->badges.push_back(badge);
    this->badgeMap[badge.getBadgeId()] = &this->badges.back();
    //this->badgeMap[badge.getBadgeId()] = &this->badges[this->badges.size() - 1];
}

/* Updates the royalty points in a badge */
void Person::updateRoyalty(Badge &badge, int newValue)
{
    Badge* bd = this->badgeMap[badge.getBadgeId()];
    bd->setRoyaltyPoints(newValue);
}

完整的代码可以在这里找到:https ://www.ideone.com/hjUT6e

在运行该函数时,大多数时候会遇到运行时错误。有时,代码按预期工作,而其他时候,该updateRoyalty()函数对版税点没有影响,这意味着它与根本没有调用该函数一样好。

有没有办法解决这种奇怪的行为?我可以想到两个想法:

1)使用std::find()函数搜索向量中的元素并重载运=算符。但这也需要 O(n) 时间

2) 代替Badge *Badge用作 中的值unordered_map。这里有两个问题。首先,Badge 没有被调用的构造函数Badge(),它有一个参数化的构造函数。所以编译器抱怨。其次,我需要重载[]运算符,编写自己的哈希函数。我对 C++ 相当陌生,所以在这里尽量保持简单(如果可能,语言独立)。

请让我知道如何实现这一目标

谢谢

编辑:该问题已被标记为重复并已关闭。重复的问题当向量需要更多内存并重新分配内存时,指针会发生什么?是一个完全不同的问题。它与调整向量内存的大小有关,而这与将指针(作为映射中的值)存储到向量元素有关。我要求重新提出这个问题。

4

0 回答 0