4

私は C++ を練習しているので、これは本番環境に入るコードではありませんが、非常に興味があります。

タイプのオブジェクトへのポインターのベクトルがありますPlayer:

std::vector<Player*> _players;

std::stringmethod を呼び出すと、各プレイヤーは自分の名前を返しますget_name()。次に例を示します。

std::string player0_name = _players[0]->get_name();

すべてのプレイヤー名を、文字列のベクトルへの参照として期待する関数に渡したい:

void all_player_names( std::vector< std::string >& );

これで、一時変数を介してこれを行うのが簡単になることがわかりました。最初に文字列のベクトルを作成し、そこにすべてのプレイヤー名を保存してから、all_player_names参照として関数に渡します。

しかし、一時変数を作成せずにそれを行う方法を探しています。Python のリスト内包表記に似たものにする必要があります。ポインターの配列を反復処理し、それぞれに対して関数をPlayer呼び出し、get_name()返された文字列からベクトルを作成し、関数に直接渡す必要がありますall_player_names。ラムダ関数とSTLのアルゴリズムで可能だと思いますが、どれかわかりません。

したがって、多かれ少なかれ次のようになります。

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

STLにそのようなアルゴリズムはありますか?

4

4 に答える 4

5

最も簡単な方法は、蓄積を使用し、バイナリ 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;
   });

ムーブ セマンティクスのおかげで、C++11 ではパフォーマンス オーバーヘッドがほとんどないはずです。

于 2013-11-14T08:56:39.770 に答える
0

あなたが望むのは、ラムダ式(または無名関数)を使用することです。

C++11 では可能になりましたが、以前のバージョンではできませんでした。問題はここでも扱われます。

あなたの場合、私は新しいクラス Players でメソッドを使用します:

class Players {
public:
    void addPlayer(Player*);
    void removePlayer(Player*);
    vector<string> getNames() {
      std::vector<string> names;
      for(unsigned int i = 0; i != players_.size(); ++i) {
        names.push_back(players_[i]->getName());
      }
    return names;
    }
private:
vector<Player*> players_;

};

于 2013-11-14T09:02:50.427 に答える
0

const ref である引数がある場合、変数を作成する以外に選択肢はありません。const ref は、既存のオブジェクトを指す必要があります。関数へのポインターと への const 参照を取るように関数を変更できますstd::vector<Player*>。関数がポインタを取り、Player彼の名前を返すようにします。

于 2013-11-14T08:54:04.593 に答える