STD的const使用:C++中的对

STD的const使用:C++中的对,c++,data-structures,stl,C++,Data Structures,Stl,为了实现二叉搜索树,我想知道为什么我们在std::pair中将Const放在K之前 template<class K,class V> class BST { public: class Node { public: pair<const K, V> data; // pair < data_type1, data_type2 > Pair_name; unique_ptr<Node> left;

为了实现二叉搜索树,我想知道为什么我们在std::pair中将Const放在K之前

template<class K,class V>
class BST {
public:
    class Node {
    public:
        pair<const K, V> data; // pair < data_type1, data_type2 > Pair_name;
        unique_ptr<Node> left;   // Create a unique_ptr object through raw pointer
        unique_ptr<Node> right;
        unique_ptr<Node> parent; 

        Node(const K& k, const V& v): //constructor
        data{std::move(k),std::move(v)}, right(nullptr),left(nullptr),parent(nullptr)
        {
        }
        ~Node() noexcept = default;


因为从逻辑上讲,数据结构中的节点键必须是不可变的:不受更改的影响。这是为了保持正确的结构布局,这取决于键的相对顺序!节点的名称

如果需要重命名节点,则需要部署更高级别的算法

当然,您的代码片段中没有任何代码会试图修改一个键——为什么会有?它不会编译但是,如果有人忘记并试图这样做,将const放在那里会在编译时强制执行。因此,这与const的其他用法的原因相同:强制不变性


出于同样的原因,std::map容器也存储std::pair。

因为从逻辑上讲,数据结构中的节点键必须是不可变的:不受更改的影响。这是为了保持正确的结构布局,这取决于键的相对顺序!节点的名称

如果需要重命名节点,则需要部署更高级别的算法

当然,您的代码片段中没有任何代码会试图修改一个键——为什么会有?它不会编译但是,如果有人忘记并试图这样做,将const放在那里会在编译时强制执行。因此,这与const的其他用法的原因相同:强制不变性


std::map容器也存储std::pair,原因与此相同。

当您希望对象为常量时,是否设置常量?在你的问题中,我们是指谁?节点在树结构中的位置取决于k的值。如果要使用某个键x将节点插入到现有树中,然后在不使用BST方法的情况下将其键更改为y,则该节点可能位于不正确的位置。当希望对象为常量时,是否设置常量?在你的问题中,我们是指谁?节点在树结构中的位置取决于k的值。如果要使用某个键x将节点插入现有树,然后在不使用BST方法的情况下将其键更改为y,则该节点可能位于错误的位置。