如何改进我的矢量搜索功能
How do I improve my vector search function?
所以我用 c++ 实现了一个 TCP 服务器,并将所有用户存储在一个向量中。现在我需要一个更通用的函数来搜索多个不同的属性,如何改进这段代码?
struct client {
std::string ip_address = "";
int socket_id = 0;
bool blocking = false;
};
enum client_codes {
ip_address,
socket_id,
blocking,
};
template<typename T>
std::vector<client>::iterator search_vector(std::vector<client> &list, int type, T query) {
std::vector<std::function<bool(client)>> comparators;
comparators.push_back([&](client ob) {return ob.ip_address == std::to_string(query); });
comparators.push_back([&](client ob) {return ob.socket_id == query; });
comparators.push_back([&](client ob) {return ob.blocking == query; });
return std::find_if(std::begin(list), std::end(list), [&](client obj) {return comparators[type](obj); });
}
// Implementation
std::vector<client> client_list;
auto search1(search_vector(client_list, socket_id, 321));
auto search2(search_vector(client_list, blocking, true));
auto search3(search_vector(client_list, ip_address, "192.168.0.85"));
由于您正在搜索相同类型的不同属性,因此我认为这是指向成员的指针的罕见用例。以下代码应有助于清理此问题:
struct client {
std::string ip_address = "";
int socket_id = 0;
bool blocking = false;
};
// search_vector accepts a pointer to member of type T, and a value of type T
template<typename T>
std::vector<client>::iterator search_vector(std::vector<client>& list, T client::*member, T value){
return std::find_if(list.begin(), list.end(), [value, member](const client& c){ return c.*member == value; });
}
这就是您现在使用它的方式,无需任何额外的enums
或特殊逻辑。
auto it1 = search_vector(client_list, &client::socket_id, 321);
auto it2 = search_vector(client_list, &client::blocking, true);
auto it3 = search_vector(client_list, &client::ip_address, "192.168.0.85");
这个精确的search_vector
函数当然仅限于成员变量和精确相等检验。但是,使用指向成员函数的指针来扩展它非常简单,例如 get_ip_address()
。
对于更通用性,当您不想要完全相等时,使用 std::function<bool(T)> condition
而不是 T value
之类的重载也可以帮助您进行更具体的搜索。
以下是一些建议:
- 假设您要多次搜索客户端向量 - 而不是使用
std::find_if
,对向量进行排序并执行二叉搜索(例如使用std::equal_range
(。如果您经常添加新客户端,请考虑使用最近添加的客户端的附加的、小的、未排序的缓冲区,并偶尔将两者集成到单个排序向量中。 - 不要将检查搜索类型的代码放在谓词中 - 这样它就会一次又一次地运行;你还需要基于堆的比较器向量 - 呃!而是在搜索类型上模板化搜索功能,并使其使用单个比较器。使用包装器函数来选择适当的搜索函数。
相关文章:
- 防弹站树搜索功能C++
- 迭代向量以获得搜索功能
- Sinlge 链表,C++,删除所有和搜索功能的问题
- 如何将搜索功能添加到数组中
- 搜索功能使程序崩溃
- 替罪羊搜索功能
- 二叉搜索功能始终返回 -1 值而不是索引
- 如何改进我的矢量搜索功能
- 链接列表中的搜索功能问题
- 如何将搜索功能添加到WXWIDGET C 中的TextCtrl
- 二进制搜索功能不起作用
- 这个树搜索功能让我发疯.它返回 NULL,但不知何故主函数中的值发生了变化
- 看不懂二叉搜索功能
- C++ 二叉搜索功能不打印
- 二进制树搜索功能
- 二叉搜索树:搜索功能问题
- C++调用-搜索功能
- 我需要在C++中构建一些单词搜索功能,但似乎它不起作用.任何线索
- 多个数组中的排序算法;二叉搜索功能
- 链表中的搜索功能 - C++