[英]C++ vector push_back not making a copy?
vector<minHeap> letters;
letters = countLetters(text);
while (letters.size() >= 2) {
minHeap first = popMin(&letters);
minHeap second = popMin(&letters);
minHeap third('$');
third.count = first.count + second.count;
third.left = &first;
third.right = &second;
letters.push_back(third);
}
我试图调试代码。 “第一”、“第二”和“第三”值工作正常。 我的问题是:当我将“第三”推入向量时,在下一轮循环中,我们在上一轮推入的 object 更改为新的“第三”,并且与“第三”相同新一轮。
例如在第一轮 X 被推入向量中,在下一轮 Y 被推入,但问题是它也将 X 更改为 Y,所以我们现在有 2 个 Y。 在下一轮中,我们再次获得 3 Z。
就像它没有创建“第三个”的副本一样,所以当我更改它时,它也会更改以前的对象。
我究竟做错了什么? :秒
编辑:
最小堆 class:
class minHeap {
public:
char letter;
int count = 1;
minHeap* left = NULL;
minHeap* right = NULL;
minHeap(char letter) {
this->letter = letter;
}
};
popMin:(在 minHeaps 中找到最小的 'count' 并销毁它,然后返回它的副本)
minHeap popMin(vector<minHeap>* letters) {
int index = 0;
for (size_t i = 0; i < letters->size(); i++) {
if (letters->at(i).count < letters->at(index).count)
index = i;
}
minHeap res = letters->at(index);
letters->erase(letters->begin() + index);
return res;
}
countLetters:(计算字母并为每个字母创建一个 minHeap object,如果之前创建,则增加“计数”(频率)。
vector<minHeap> countLetters(string text) {
vector<minHeap> letters; // Stores all the characters with their count
for (size_t i = 0; i < text.length(); i++) {
bool found = false;
for (size_t j = 0; j < letters.size(); j++) {
if (letters.at(j).letter == text[i]) {
letters.at(j).count++; // Character exists in list, increase its count by one
found = true;
break;
}
}
if (!found) { // Character doesn't exist in list, create it and push it to the list
minHeap letter(text[i]);
letters.push_back(letter);
}
}
return letters;
}
一般来说:我正在尝试使用 minHeap 进行霍夫曼编码。
您正在存储 &first 和 &second,当当前迭代结束时,它们成为无效指针。 如果在此之后取消引用它们,则您的程序具有未定义的行为。 @molbdnilo
所以我将代码更改为:
vector<minHeap> letters;
letters = countLetters(text);
while (letters.size() >= 2) {
minHeap* first = new minHeap('-');
*first = popMin(&letters);
minHeap* second = new minHeap('-');
*second = popMin(&letters);
minHeap third('$');
third.count = first->count + second->count;
third.left = first;
third.right = second;
letters.push_back(third);
}
它是固定的。 谢谢:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.