c++ - vector访问速度,哪种方法更快?

标签 c++ performance pointers vector

我很好奇访问 vector 时哪种方法更快。

为了简单起见,假设我有两个对象:PlayerShip .

有一个玩家指针 vector vector<Player*> players每个玩家对象都包含一个船舶指针 vector vector<Ship*> ships ,然后每艘船都有几个可以调用的函数,等等。

在这些情况下,直接访问这些函数是否更快?或者创建一个临时对象指针来访问所有内容?

这样做是否更快:

for (int i = 0; i < players.size(); i++)
{
    for (int j = 0; j < players.at(i)->ships.size(); j++)
    {
        players.at(i)->ships.at(j)->update();
        if (
               (players.at(i)->ships.at(j)->get_x() > 0)    &&
               (players.at(i)->ships.at(j)->get_x() < screen_x)    &&
               (players.at(i)->ships.at(j)->get_y() > 0)    &&
               (players.at(i)->ships.at(j)->get_y() < screen_y)
           )
        {
            players.at(i)->visible.push_back(j);
        }
    }
}

还是创建临时指针更快,这样就不需要持续访问 vector 了:

for (int i = 0; i < players.size(); i++)
{
    Player* play = players.at(i);
    for (int j = 0; j < play->ships.size(); j++)
    {
        Ship* ship = play->ships.at(j);
        ship->update();

        int ship_x = ship->get_x();
        int ship_y = ship->get_y();
        if (
               (ship_x > 0)    &&
               (ship_x < screen_x)    &&
               (ship_y > 0)    &&
               (ship_y < screen_y)
           )
        {
            play->visible.push_back(j);
        }
    }
}

我知道第二个在视觉上更整洁,但真的不知道它是否一定更快。

想法?

最佳答案

在我看来,对速度的强调是错误的。我认为您应该先编写代码以提高可读性:

auto is_visible = [=](Ship const &s) { return s.get_x() > 0 && s.get_x() < screen_x 
                                           && s.get_y() > 0 && s.get_y() < screen_y; 
                                     };

for (auto & player : players)
    std::copy_if(ships.begin(), ships.end(), 
                 std::back_inserter(player.visible),
                 is_visible);

至少在 IMO 中,这至少与使用 at 进行索引一样安全,但可能至少与使用 [] 一样快,并且比任何一种都更具可读性.

我应该再补充一点:可见性似乎并不取决于玩家。至少从代码的编写方式来看,所有玩家都将拥有相同的可见飞船集。如果那是正确的,您可能想做更像的事情:

std::vector<Ship> visible;

std::copy_if(ships.begin(), ships.end(), 
             std::back_inserter(visible),
             [=](Ship const &s) { return s.get_x() > 0 && s.get_x() < screen_x 
                                      && s.get_y() > 0 && s.get_y() < screen_y; });

for (auto &player : players)
    player.visible = visible;

关于c++ - vector访问速度,哪种方法更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25836155/

相关文章:

c++ - memcpy,其中大小在编译时已知

c++ - 为什么定时锁在C++0x中不会抛出超时异常?

c++ - 使用 any_of 找到的值在 lambda 外部的返回中使用

ajax - 连续的 AJAX 请求 - 对网络应用程序的影响?

c++ - 指向非 union 类的指针的大小可以不同吗?

c - 练习指点,请问如何去掉这个警告?

pointers - 将 *os.File 作为 *io.Reader 传递

c++ - 数据库 |查看可变参数列表

mysql - 加速mysql查询距离(纬度,经度)

mysql - 应用多个过滤器时如何提高查询性能?