如何改进向量搜索功能? 我在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客户端{ std::string ip_address=“”; int socket_id=0; 布尔阻塞=假; }; 枚举客户端代码{ ip地址, 插座id, 舞台调度, }; 模板 std::vector::迭代器搜索_vector(std::vector&list,int类型,T查询){ 矢量比较器; push_back([&](客户端ob){return ob.ip_address==std::to_string(query);}); push_back([&](客户端ob){return ob.socket_id==query;}); push_back([&](客户机ob){return ob.blocking==query;}); 返回std::find_if(std::begin(list),std::end(list),[&](client obj){返回比较器[type](obj);}); } //实施 std::向量客户端列表; 自动搜索1(搜索向量(客户端列表,套接字id,321)); 自动搜索2(搜索向量(客户端列表,阻塞,真)); 自动搜索3(搜索向量(客户端列表,ip地址,“192.168.0.85”);

如何改进向量搜索功能? 我在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客户端{ std::string ip_address=“”; int socket_id=0; 布尔阻塞=假; }; 枚举客户端代码{ ip地址, 插座id, 舞台调度, }; 模板 std::vector::迭代器搜索_vector(std::vector&list,int类型,T查询){ 矢量比较器; push_back([&](客户端ob){return ob.ip_address==std::to_string(query);}); push_back([&](客户端ob){return ob.socket_id==query;}); push_back([&](客户机ob){return ob.blocking==query;}); 返回std::find_if(std::begin(list),std::end(list),[&](client obj){返回比较器[type](obj);}); } //实施 std::向量客户端列表; 自动搜索1(搜索向量(客户端列表,套接字id,321)); 自动搜索2(搜索向量(客户端列表,阻塞,真)); 自动搜索3(搜索向量(客户端列表,ip地址,“192.168.0.85”);,c++,c++11,search,lambda,stdvector,C++,C++11,Search,Lambda,Stdvector,以下是一些建议: 假设您正在多次搜索客户机向量-而不是使用std::find_if,对向量进行排序并执行二进制搜索(例如使用)。如果您经常添加新客户端,请考虑使用最近添加的客户端的附加的、小的、未排序的缓冲区,并偶尔将这两个缓冲区集成为一个单独的排序向量。 不要将检查搜索类型的代码放在谓词中——这样它就会一次又一次地运行;您还需要基于堆的比较器向量-啊。。。相反,在搜索类型上模板化搜索函数,并让它使用单个比较器。使用选择适当搜索函数的包装函数 由于您正在搜索相同类型的不同属性,我认为这是一个罕见

以下是一些建议:

  • 假设您正在多次搜索客户机向量-而不是使用
    std::find_if
    ,对向量进行排序并执行二进制搜索(例如使用)。如果您经常添加新客户端,请考虑使用最近添加的客户端的附加的、小的、未排序的缓冲区,并偶尔将这两个缓冲区集成为一个单独的排序向量。
  • 不要将检查搜索类型的代码放在谓词中——这样它就会一次又一次地运行;您还需要基于堆的比较器向量-啊。。。相反,在搜索类型上模板化搜索函数,并让它使用单个比较器。使用选择适当搜索函数的包装函数

  • 由于您正在搜索相同类型的不同属性,我认为这是一个罕见的用例。以下代码应有助于清理此问题:

    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; });
    }
    
    这个精确的
    search\u vector
    函数当然仅限于成员变量和精确相等性测试。但是,对于像
    get\u ip\u address()


    为了更一般性,当您不希望完全相等时,使用类似于
    std::function condition
    的重载代替
    T value
    也可以帮助您进行更具体的搜索。

    若要询问对已经工作的代码的改进,您最好询问一下。您所说的“搜索多个不同的属性”是什么意思确切地你能举个例子吗?简单一点。没有理由先填充一个向量,然后将索引传递给该向量,然后直接传递相应的谓词。或者使用简单的(可能是内联的)函数,如
    FindBySocketId
    。这样,您就可以遵循DRY原则,对代码进行本地化,从而了解如何保存数据的内部细节,如果您需要改进代码,这将有助于维护。
    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");