我很好奇访问 vector 时哪种方法更快。
为了简单起见,假设我有两个对象:Player
和 Ship
.
有一个玩家指针 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/