这是我遇到的问题:
DNS查询以随机顺序生成ip地址列表。佛 例如,如果有4个地址,则查询2次导致4个地址 以不同的顺序出现。
现在要求设置一个可以访问O(1)中地址的有序表。
潜在的解决方案是每次都订购ip地址。所以对于ex,如果收到2,1,7,4,我们可以对它进行排序,结果总是1,2,4,7,并且通过将ip地址放在向量中,我们可以用O(1)<索引它/ p>
可以使用O(1)或最差O(logn)
来完成问题是每次有序列表作为输入时都要保持IP地址的排序
答案 0 :(得分:0)
这样的事情?
#include <unordered_map>
#include <array>
#include <algorithm>
#include <initializer_list>
#include <cassert>
struct ip_address
{
ip_address(std::initializer_list<std::uint8_t> il)
{
auto max = std::min(il.size(),_ip4_data.size());
assert(max == 4);
std::copy_n(il.begin(), max, _ip4_data.begin());
}
auto& data() const { return _ip4_data; }
auto& data() { return _ip4_data; }
const uint8_t& operator[](std::size_t i) const {
return _ip4_data[i];
}
std::array<std::uint8_t, 4> _ip4_data;
};
bool operator==(const ip_address& l, const ip_address& r)
{
return l.data() == r.data();
}
namespace std
{
template<> struct hash<ip_address> {
std::size_t operator()(const ip_address& r) const
{
// reverse the byte order so that the lsb of the ip
// has the greatest effect on the hash value
return std::size_t((r[3] << 24) & 0xff000000
+ (r[2] << 16) & 0x00ff0000
+ (r[1] << 8) & 0x0000ff00
+ r[0] & 0x000000ff);
}
};
}
using client_server_map = std::unordered_map<ip_address, ip_address>;
int main()
{
client_server_map cs_map;
cs_map.emplace(ip_address{10, 0, 0, 1}, ip_address{192, 168, 0, 1});
cs_map.emplace(ip_address{10, 0, 0, 2}, ip_address{192, 168, 0, 2});
cs_map.erase(ip_address{10, 0, 0, 1});
}