gpt4 book ai didi

c++ - 如何更新 std::set 的现有元素?

转载 作者:IT老高 更新时间:2023-10-28 12:29:02 25 4
gpt4 key购买 nike

我有一个 std::set<Foo> ,我想更新一些值其中的现有元素。请注意,我正在更新的值不会更改集合中的顺序:

#include <iostream>
#include <set>
#include <utility>

struct Foo {
Foo(int i, int j) : id(i), val(j) {}
int id;
int val;
bool operator<(const Foo& other) const {
return id < other.id;
}
};

typedef std::set<Foo> Set;

void update(Set& s, Foo f) {
std::pair<Set::iterator, bool> p = s.insert(f);
bool alreadyThere = p.second;
if (alreadyThere)
p.first->val += f.val; // error: assignment of data-member
// ‘Foo::val’ in read-only structure
}

int main(int argc, char** argv){
Set s;
update(s, Foo(1, 10));
update(s, Foo(1, 5));
// Now there should be one Foo object with val==15 in the set.
return 0;
}

有什么简洁的方法可以做到这一点吗?或者我是否必须检查元素是否已经存在,如果存在,请将其删除,添加值并重新插入?

最佳答案

由于val不参与比较,所以可以声明为mutable

struct Foo {
Foo(int i, int j) : id(i), val(j) {}
int id;
mutable int val;
bool operator<(const Foo& other) const {
return id < other.id;
}
};

这意味着 val 的值可能会在逻辑上为常量 Foo 中发生变化,这意味着它不应影响其他比较运算符等。

或者你可以删除和插入,如果插入使用位置 just before 就在旧位置之后作为提示,则需要 O(1) 额外的时间(与访问和修改相比)。

类似:

bool alreadyThere = !p.second; // you forgot the !
if (alreadyThere)
{
Set::iterator hint = p.first;
hint++;
s.erase(p.first);
s.insert(hint, f);
}

关于c++ - 如何更新 std::set 的现有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340434/

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