在C++中,std::set
是一个关联容器,它包含一组唯一的对象。当一个新的元素被添加到set
中时,默认情况下不会自动调用任何函数。但是,你可以通过几种方法来实现当元素被添加到set
时调用特定的函数。
你可以定义一个自定义的比较函数或结构体,并在其中包含你想要调用的逻辑。然后,将这个比较函数或结构体作为std::set
的第三个模板参数传递。
#include <iostream>
#include <set>
struct MyElement {
int value;
// 其他成员...
};
struct CompareAndCall {
bool operator()(const MyElement& lhs, const MyElement& rhs) const {
// 比较逻辑...
bool result = lhs.value < rhs.value;
// 调用函数
if (result) {
std::cout << "Element added: " << lhs.value << std::endl;
}
return result;
}
};
int main() {
std::set<MyElement, CompareAndCall> mySet;
MyElement elem1{10};
mySet.insert(elem1); // 这里会调用CompareAndCall中的函数
return 0;
}
insert
方法的返回值std::set::insert
方法返回一个std::pair
,其中包含一个迭代器指向插入的元素(或已存在的相同元素)和一个布尔值,指示元素是否被实际插入。你可以利用这个布尔值来决定是否调用函数。
#include <iostream>
#include <set>
struct MyElement {
int value;
// 其他成员...
};
bool onElementAdded(const MyElement& elem) {
std::cout << "Element added: " << elem.value << std::endl;
return true;
}
int main() {
std::set<MyElement> mySet;
MyElement elem1{10};
auto result = mySet.insert(elem1);
if (result.second) { // 如果元素被添加
onElementAdded(*result.first); // 调用函数
}
return 0;
}
如果你需要在多个地方响应元素的添加,可以考虑使用观察者模式。创建一个观察者类,当set
中的元素发生变化时,通知所有观察者。
#include <iostream>
#include <set>
#include <vector>
class Observer {
public:
virtual void onElementAdded(int value) = 0;
};
class MySetObserver : public Observer {
public:
void onElementAdded(int value) override {
std::cout << "Element added: " << value << std::endl;
}
};
class ObservableSet {
std::set<int> elements;
std::vector<Observer*> observers;
public:
void addObserver(Observer* observer) {
observers.push_back(observer);
}
void addElement(int value) {
elements.insert(value);
for (Observer* observer : observers) {
observer->onElementAdded(value);
}
}
};
int main() {
ObservableSet mySet;
MySetObserver observer;
mySet.addObserver(&observer);
mySet.addElement(10); // 这里会调用观察者的onElementAdded方法
return 0;
}
这些方法可以应用于需要在元素添加到集合时执行特定逻辑的场景,例如:
选择哪种方法取决于你的具体需求和偏好。如果逻辑简单,可能直接在比较函数中调用即可;如果需要更复杂的响应机制,观察者模式可能更合适。
领取专属 10元无门槛券
手把手带您无忧上云