首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进我的向量搜索功能?

如何改进我的向量搜索功能?
EN

Stack Overflow用户
提问于 2019-03-23 16:18:35
回答 2查看 103关注 0票数 1

因此,我在c++中实现了一个TCP服务器,并将所有用户存储在一个向量中。现在我需要一个更通用的函数来搜索多个不同的属性,如何改进这段代码?

代码语言:javascript
复制
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"));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-23 16:38:56

由于您正在搜索相同类型的不同属性,所以我认为这对于pointers to members来说是一个罕见的用例。下面的代码应该有助于清理这个问题:

代码语言:javascript
复制
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或特殊的逻辑。

代码语言:javascript
复制
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的重载也可以帮助您执行更具体的搜索。

票数 1
EN

Stack Overflow用户

发布于 2019-03-23 16:29:44

以下是一些建议:

  1. 假设您多次搜索客户端向量--而不是使用std::find_if,对向量进行排序并执行二进制搜索(例如使用std::equal_range)。如果您经常添加新客户端,请考虑使用最近添加的客户端的附加、小的、未排序的缓冲区,并偶尔将两者集成到一个排序向量中。
  2. 不要将检查搜索类型的代码放在谓词中--这样它就会一次又一次地运行;而且您还需要基于堆的比较器向量!相反,模板您的搜索函数的搜索类型,并让它使用一个比较器。使用包装器函数来选择适当的搜索函数。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55315806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档