gpt4 book ai didi

c++ - 我该如何改进这种强制我声明成员函数 const 并声明变量可变的设计?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:27 24 4
gpt4 key购买 nike

出于某种原因,我在 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 但我很好奇您是否可以建议其他选项)以删除可变和常量?

谢谢

最佳答案

你不能。为了容器的正确性,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 并声明变量可变的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com