c – 如何改进这个设计,迫使我声明一个成员函数const并声明变量是多变的?

c – 如何改进这个设计,迫使我声明一个成员函数const并声明变量是多变的?,第1张

概述出于某种原因,我在std :: set中迭代一个类的元素,并且想要稍微修改键,知道顺序将保持不变. std :: set上的迭代器是const_iterators,因为如果修改了密钥,则可能导致订单错误,从而导致设置损坏.但是我确信我的 *** 作不会改变集合中元素的顺序. 目前,这是我的解决方案: class Foo{public: Foo(int a, int b): a_(a),b_(b 出于某种原因,我在std :: set中迭代一个类的元素,并且想要稍微修改键,知道顺序将保持不变.

std :: set上的迭代器是const_iterators,因为如果修改了密钥,则可能导致订单错误,从而导致设置损坏.但是我确信我的 *** 作不会改变集合中元素的顺序.

目前,这是我的解决方案:

class Foo{public:    Foo(int a,int b): a_(a),b_(b) {}   ~Foo(){}    bool operator < (const Foo& o) const { return this.a_ < o.a_ ; }    voID incrementB() const { ++b_; } // <-- the problem: it is not const!private:    const int a_;    mutable int b_;                   // <-- I would like to avoID this}voID f(){    std::set<Foo> s;    // loop and insert many (distinct on a_) Foo elements;    std::for_each(s.begin(),c.end(),[](const Foo& s) { s.incrementB(); }); // Foo must be const. iterators are const_iterators}

你会如何修改它(我知道我可以使用std :: map但我很好奇你是否可以建议其他选项)来删除mutable和const?

谢谢

解决方法 你不能.容器正确性要求set元素为const:

迫使您意识到关键部分需要是不可变的,否则数据结构不变量将被破坏.

struct element {     std::string key_part; // const in the set     bool operator<(const element&o) const { return key_part<o.key_part; }  private:     mutable int m_cached; // non-key,*NOT* used in operator<};

如果你想保留在非关键部分“表达”常量的可能性,可将其拆分成对并将它们存储在地图中:

std::map<std::string /*key_part*/,int /*m_cached*/> mapped;

或者,更灵活:

struct element {     std::string key_part; // const in the set     bool operator<(const element&o) const { return key_part<o.key_part; }     struct value {         int m_cached;         int m_moredata; //...     } /*not in the element itself*/;};std::map<element,element::value> mapped;
总结

以上是内存溢出为你收集整理的c – 如何改进这个设计,迫使我声明一个成员函数const并声明变量是多变的?全部内容,希望文章能够帮你解决c – 如何改进这个设计,迫使我声明一个成员函数const并声明变量是多变的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存