51 lines
1.4 KiB
C++
51 lines
1.4 KiB
C++
#include <map>
|
||
#include <string>
|
||
#include <unordered_map>
|
||
#include <vector>
|
||
|
||
class MapUpdater {
|
||
public:
|
||
std::map<std::string, double> data;
|
||
|
||
// 初始化:预建立迭代器缓存(只执行一次)
|
||
void init(const std::vector<std::string> &ordered_keys) {
|
||
// 先插入所有 key(确保存在)
|
||
for (const auto &key : ordered_keys) {
|
||
data[key] = 0.0;
|
||
}
|
||
|
||
// 预缓存迭代器
|
||
iter_cache.reserve(ordered_keys.size());
|
||
for (const auto &key : ordered_keys) {
|
||
iter_cache[key] = data.find(key);
|
||
}
|
||
ordered_keys_ = ordered_keys;
|
||
}
|
||
|
||
// 高效更新(每 50ms 调用):无需查找,直接写值
|
||
void update(const std::string &key, double value) {
|
||
auto it = iter_cache.find(key);
|
||
if (it != iter_cache.end()) {
|
||
it->second->second = value;
|
||
}
|
||
}
|
||
|
||
// 按固定顺序刷新全部(批量模式)
|
||
void refresh_all(const std::vector<double> &values) {
|
||
for (size_t i = 0; i < ordered_keys_.size(); ++i) {
|
||
iter_cache[ordered_keys_[i]]->second = values[i];
|
||
}
|
||
}
|
||
|
||
// 按固定顺序遍历
|
||
void for_each_ordered(std::function<void(const std::string &, double)> fn) {
|
||
for (const auto &key : ordered_keys_) {
|
||
fn(key, data[key]);
|
||
}
|
||
}
|
||
|
||
private:
|
||
std::vector<std::string> ordered_keys_;
|
||
std::unordered_map<std::string, std::map<std::string, double>::iterator>
|
||
iter_cache;
|
||
}; |