我有一个 class Person
,它有另一个类的向量Badge
(具有唯一的 Id)。要访问向量中的所有元素,我可以遍历元素,这需要 O(n) 时间,n 是向量的大小。我想在恒定时间内完成,所以我创建了一个地图,其中Badge
id 作为键,指针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++ 相当陌生,所以在这里尽量保持简单(如果可能,语言独立)。
请让我知道如何实现这一目标
谢谢
编辑:该问题已被标记为重复并已关闭。重复的问题当向量需要更多内存并重新分配内存时,指针会发生什么?是一个完全不同的问题。它与调整向量内存的大小有关,而这与将指针(作为映射中的值)存储到向量元素有关。我要求重新提出这个问题。