我正在练习 C++,所以这不是将要投入生产的代码,但我非常想知道:
我有一个指向 Player
类型对象的指针 vector :
std::vector<Player*> _players;
当我调用它的方法 get_name()
时,每个玩家都将他的名字作为 std::string
返回给我,例如:
std::string player0_name = _players[0]->get_name();
我想将所有玩家名称传递给一个函数,该函数期望将它们作为对字符串 vector 的引用:
void all_player_names( std::vector< std::string >& );
现在我知道通过一些临时变量可以很容易地做到这一点。我可以先创建一个字符串 vector ,将所有玩家姓名存储在那里,然后将其传递给函数 all_player_names
作为引用。
但我正在寻找一种无需创建临时变量即可执行此操作的方法。它应该类似于 Python 中的列表理解。它必须遍历 Player
指针数组,对每个指针调用 get_name()
函数,从返回的字符串中构建一个 vector 并将其直接传递给函数 all_player_names
。我假设它应该可以通过 lambda 函数和来自 STL 的一些算法实现,但我不知道是哪一个。
所以它应该看起来或多或少像这样:
all_player_names(<function that i'm looking for>(
_players, [](Player* p) { return p->get_name();}
);
STL中有这样的算法吗?
最佳答案
最简单的方法是使用 accumulate 并使用将通过二进制操作传递并返回的临时变量:
std::accumulate(_players.begin(), _players.end(),
std::vector<std::string>(),
[](std::vector<std::string>& vector, const Player* elem)
{
vector.push_back(elem->get_name());
return vector;
});
由于移动语义,它在 C++11 中应该几乎没有性能开销。
关于C++从函数调用的多个返回构建字符串 vector 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972929/