作为一名高级工程师使用C++中STL容器map优化下列函数使时间复杂度最低32位程序typedef struct uint32_t old_func; 这里包含基准地址 uint32_t new_func; uint32_t count; vectoruint32_t old_pos_v; 此处不包含基准地址 vectoruint3
使用C++中的STL容器map可以优化上述函数。首先,将m_vec_invalid_func_addr和m_vec_normal_func_addr改为map容器类型,key为old_func和new_func的组合。然后,使用迭代器进行查找和插入操作,这样可以减少时间复杂度。
下面是使用map容器优化后的代码:
typedef struct { uint32_t old_func; uint32_t new_func; uint32_t count; vector<uint32_t> old_pos_v; vector<uint32_t> new_pos_v; }addr_map_t;
std::map<std::pair<uint32_t, uint32_t>, addr_map_t> m_map_invalid_func_addr; // 保存无效的跳转信息 std::map<std::pair<uint32_t, uint32_t>, addr_map_t> m_map_normal_func_addr; // 保存正常匹配的所有地址映射
int save_normal_func(uint32_t func0, uint32_t func1, uint32_t pos0, uint32_t pos1) { std::pair<uint32_t, uint32_t> key = std::make_pair(func0, func1); auto it = m_map_normal_func_addr.find(key); if (it != m_map_normal_func_addr.end()) { it->second.count++; it->second.old_pos_v.push_back(pos0); it->second.new_pos_v.push_back(pos1); return 0; }
addr_map_t st;
st.count = 1;
st.old_func = func0;
st.new_func = func1;
st.old_pos_v.push_back(pos0);
st.new_pos_v.push_back(pos1);
m_map_normal_func_addr[key] = st;
return 1;
}
int save_invalid_func(uint32_t func0, uint32_t pos0, uint32_t pos1) { std::pair<uint32_t, uint32_t> key = std::make_pair(func0, 0); auto it = m_map_invalid_func_addr.find(key); if (it != m_map_invalid_func_addr.end()) { it->second.count++; it->second.old_pos_v.push_back(pos0); it->second.new_pos_v.push_back(pos1); return 0; }
addr_map_t st;
st.count = 1;
st.old_func = func0;
st.old_pos_v.push_back(pos0);
st.new_pos_v.push_back(pos1);
m_map_invalid_func_addr[key] = st;
return 1;
}
这样,使用map容器可以将查找和插入操作的时间复杂度从O(n)降低到O(logn),使得程序的效率更高
原文地址: http://www.cveoy.top/t/topic/iRSp 著作权归作者所有。请勿转载和采集!