C++ 使用map或者set容器进行优化:typedef struct uint32_t old_func; 这里包含基准地址 uint32_t new_func; uint32_t count; vectoruint32_t old_pos_v; 此处不包含基准地址 vectoruint32_t new_pos_v; 此处
使用map容器进行优化可以避免遍历查找的时间复杂度O(n),可以降低到O(logn)。
首先需要修改addr_map_t结构体,使其能够比较大小和作为map的key:
struct addr_map_t
{
uint32_t old_func;
uint32_t new_func;
uint32_t count;
vector<uint32_t> old_pos_v;
vector<uint32_t> new_pos_v;
bool operator<(const addr_map_t& other) const
{
return old_func < other.old_func || (old_func == other.old_func && new_func < other.new_func);
}
};
然后使用map容器来存储addr_map_t对象,将old_func和new_func作为key:
std::map<addr_map_t, int> m_map_normal_func_addr;
修改save_normal_func函数:
int save_normal_func(uint32_t func0, uint32_t func1, uint32_t pos0, uint32_t pos1)
{
addr_map_t st;
st.old_func = func0;
st.new_func = func1;
auto it = m_map_normal_func_addr.find(st);
if (it != m_map_normal_func_addr.end())
{
it->second++;
it->first.old_pos_v.push_back(pos0);
it->first.new_pos_v.push_back(pos1);
return 0;
}
st.count = 1;
st.old_pos_v.push_back(pos0);
st.new_pos_v.push_back(pos1);
m_map_normal_func_addr[st] = 1;
return 1;
}
这样就可以使用map容器来优化查找和插入操作了
原文地址: https://www.cveoy.top/t/topic/iROx 著作权归作者所有。请勿转载和采集!