C++从函数调用的多个返回构建字符串向量的最佳方法

rep*_*lay 4 c++ string lambda vector c++11

我正在练习C++,所以这不是将要投入生产的代码,但我很想知道:

我有一个指向类型对象的指针向量Player:

std::vector<Player*> _players;
Run Code Online (Sandbox Code Playgroud)

std::string当我称之为方法时get_name(),每个玩家都会返回他的名字,例如:

std::string player0_name = _players[0]->get_name();
Run Code Online (Sandbox Code Playgroud)

我想将所有玩家名称传递给一个函数,该函数期望它们作为字符串向量的引用:

void all_player_names( std::vector< std::string >& );
Run Code Online (Sandbox Code Playgroud)

现在我知道通过一些临时变量很容易做到这一点.我可以先创建一个字符串向量,在那里存储所有玩家名称,然后将其all_player_names作为参考传递给函数.

但我正在寻找一种方法,而无需创建临时变量.它应该类似于Python中的列表理解.它必须迭代Player指针数组,get_name()在每个指针上调用函数,从返回的字符串中构建一个向量并直接将其传递给函数all_player_names.我假设应该可以使用lambda函数和STL中的一些算法,但我不知道哪一个.

所以看起来应该或多或少是这样的:

all_player_names(<function that i'm looking for>(
    _players, [](Player* p) { return p->get_name();}
);
Run Code Online (Sandbox Code Playgroud)

STL中有这样的算法吗?

Joh*_*han 5

最简单的方法是使用accumulate并使用一个临时变量,该变量将通过二进制op传递并返回:

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;
   });
Run Code Online (Sandbox Code Playgroud)

由于移动语义,它在C++ 11中几乎没有性能开销.

  • +1你的解决方案是好的.仍然请在答案中指出您仍然创建一个临时变量并将其作为参数传递.使用此函数声明无法避免这种情况. (2认同)