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