【发布时间】:2023-04-06 09:25:01
【问题描述】:
我正在尝试编写一个创建 Huffman 树的函数(作为创建 Huffman 编码的一部分)。
该函数接收unique_ptrs 到Node 对象的std::vector,其中包含有关字符、其频率以及左右儿子的信息(unique_ptrs 到其他Nodes)。
本质上,我想做的是将所有对象移动到std::list,如果它们的频率大于0,然后对列表进行排序,然后继续使用将构建树的算法(这是这个问题的范围)。
经过多次尝试让它在只能移动的对象上工作后,我已经成功地正确使用了std::copy_if,但我无法对结果进行排序。
在以下代码中,NodePtr 是 std::unique_ptr<Node> 的别名,NodeVector 是 std::vector<NodePtr> 的别名:
HuffmanEncoderDecoder::NodePtr &HuffmanEncoderDecoder::buildPrefixlessTree(NodeVector &frequencies) {
std::list<NodePtr> sortedFrequencies;
// Copy to list only if the character appeared at least once
std::copy_if(std::make_move_iterator(frequencies.begin()), std::make_move_iterator(frequencies.end()),
sortedFrequencies.begin(), [](NodePtr &&node) { return node->frequency != 0; });
// Sort the list by ascending order of frequency
std::sort(sortedFrequencies.begin(), sortedFrequencies.end(), [](const NodePtr &n1, const NodePtr &n2)
{ return n1->frequency <= n2->frequency; });
// ...
}
我正在使用clang++,它输出以下错误:
error: invalid operands to binary expression ('std::_List_iterator<std::unique_ptr<HuffmanEncoderDecoder::Node,
std::default_delete<HuffmanEncoderDecoder::Node> > >' and 'std::_List_iterator<std::unique_ptr<HuffmanEncoderDecoder::Node, std::default_delete<HuffmanEncoderDecoder::Node> > >')
if (__last - __first > int(_S_threshold))
~~~~~~ ^ ~~~~~~~
老实说,我什至不确定这是移动语义问题,还是我遗漏的其他问题,因此不胜感激。
【问题讨论】:
标签: c++ lambda stl move-semantics