【问题标题】:C++ std::sort of const structC++ std::sort of const 结构
【发布时间】:2016-03-06 21:45:01
【问题描述】:

我在vector 中有以下struct

struct ub_node {
    const size_t index;
    const double ub_dist;
    bool operator<(const ub_node &rhs) const { return ub_dist< rhs.ub_dist; }
};

我想对 vector 进行排序。我曾尝试使用std::sort,但出现编译错误: error: use of deleted function ‘ub_node&amp; ub_node::operator=(ub_node&amp;&amp;)’ 引用了我执行std::sort(result.begin(), result.end()); 的行,其中result 的类型为vector&lt;ub_node&gt;

据我了解,const 确实不会影响执行时间,但只是确保程序员(我)不会做任何愚蠢的事情。如果是这种情况,我可能会删除 const 并尝试确保以后不会更改节点。有人可以证实这一点吗?或者帮我整理一下?

【问题讨论】:

    标签: sorting c++11 vector struct constants


    【解决方案1】:

    据我了解,const 不会影响执行时间,而只是确保程序员(我)不会做任何愚蠢的事情。

    正确。

    对向量进行排序会交换元素,如果元素具有不可变数据,则这是不可能的(使用您的 ub_node 类型,您甚至不能在除向量末尾之外的任何地方删除或插入元素,因为这也需要修改现有元素)。

    我建议你从你的成员中删除const,以便可以修改类型,然后构建你的代码,以便程序中不应该修改它的部分只与它交互通过const ub_node&amp;const ub_node* 上课。

    这意味着该类在必要时是可修改的,但不会被不应修改它的程序部分修改。

    【讨论】:

    • 这是否意味着,如果我的struct 有一个复杂的成员,例如另一个vector,然后对它进行排序会产生很多这些vectors 的副本,还是只是更改参考?
    • 对结构的向量vec 进行排序将调用swap(vec[i], vec[j]) 很多次。这是否有效或对结构成员进行大量分配取决于您是否为您的类型重载了swap,或者您的类型是否可以廉价地移动分配。如果您的班级重载swap 或遵循the rule of five or the rule of zero,那么排序将很便宜,无需复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2013-08-14
    相关资源
    最近更新 更多