从vector的元素获取指针

时间:2018-03-02 17:32:01

标签: c++

我想从vector的元素中获取一个指针,该元素的Fd属性设置在所需的值上。现在我正在使用这个丑陋的代码:

User* Game::GetUser(int fd)
{
    for(auto& v : users)
        if (v.Fd == fd)
            return &v;

    return nullptr;
}

如何更改此代码与此类似:

void Game::RemoveUser(int fd)
{
    users.erase(remove_if(begin(users), end(users), [fd](User const& u)
    {
        return u.Fd == fd;
    }), end(users));
}

或许还有其他更好的方法可以对此进行编码?

1 个答案:

答案 0 :(得分:3)

  

如何更改此代码以更加类似于此

只需使用相同谓词的std::find_if

User* Game::GetUser(int fd)
{
    auto it = find_if(begin(users), end(users), [fd](User const& u)
    {
        return u.Fd == fd;
    }));
    return it == end(users) ? nullptr : &*it;
}

为了避免代码重复,您也可以使用find_if的结果进行擦除:

  users_type::iterator findUser( int fd)
  {
        return find_if(begin(users), end(users), [fd](User const& u)
        {
             return u.Fd == fd;
        }));
  }

User* Game::GetUser(int fd)
{
     auto it = findUser( fd );
     return it == end( users ) ? nullptr : &*it;
 }

void Game::RemoveUser(int fd)
{
     auto it = findUser( fd );
     if( it != end(users) )
         users.erase( it );
}

如果此类操作必须经常发生,您可以考虑使用不同的容器,因为std::find_ifstd::remove_if都与元素数量成线性关系。或者,您可能希望将users排序并使用std::equal_range()而不是std::find_if() log(N),但您需要使用findUser来查找正确的位置插入后插入或使用std::sort