代码之家  ›  专栏  ›  技术社区  ›  Oliver Charlesworth

std::map value对象是否可以包含对相应键的引用?

  •  -1
  • Oliver Charlesworth  · 技术社区  · 14 年前

    基本上,我想要的是 value 对象以维护对相应的 key 对象,因为其中有一些有用的信息,通过 价值 对象。

    我所要做的可能不太合理,但请考虑以下几点:

    class key
    {
        // ... Various members ...
        friend bool operator< (const key &lhs, const key &rhs) { /* ... */ }
    };
    
    class value
    {
    public:
        value(const key &k) : k(k) {}
    private:
         const key &k;
        // ... Various members ...
    
    };
    
    
    std::map<key,value> m;
    
    // start a new scope, which may be due to e.g. function call, loop, etc.
    {
        key k;  // I'm on the stack!
    
        m.insert(std::pair<key,value>(k, value(k)));
    }
    

    当然,这不起作用,因为这是对堆栈对象的引用,一旦 k 超出范围。是否有某种方法可以使引用返回到 map ?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Walter Mundt    14 年前

    您可以在插入后将引用放在适当的位置,但必须使其成为一个指针:

    std::map<key, value>::iterator iter = m.insert(std::make_pair(k, v)).first;
    iter->second.setValue(&iter->first);
    
        2
  •  1
  •   jkerian    14 年前

    为什么不引用值成员作为您的键?

    class key { friend bool operator< (const key &,const key&); }
    class value {
        public:
           value(const key &k) : k(k) {}
           const key &key() const {return k};
        private:
           key k;
    }
    
    std::map<key,value> m;
    key k;
    value v(k);
    m.insert(std::pair<key,value>(v.key(),v));
    

    …或者一些。似乎在值对象内构造键通常比较容易。

    更像:

    #include <map>
    #include <iostream>
    
    struct key {
        key(unsigned int ik) : k(ik) {}
        unsigned int k;
        friend bool operator< (const key &,const key &);
    };
    bool operator<  (const key &me,const key &other) {return me.k < other.k;}
    
    struct value {
        value(unsigned int ik, unsigned int iv) : k(ik), v(iv) {}
        const key &theKey() const {return k;}
        unsigned int v;
        key k;
    };
    
    int main() {
        std::map<key,value> m;
        value v(1,3);
        m.insert(std::pair<key,value>(v.theKey(),v));
    
        for(std::map<key,value>::iterator it=m.begin(); it!=m.end();++it)
            std::cout << it->second.theKey().k << " " << it->second.v << "\n";
        return 0;
    }