2016-11-24 15 views
0
UserFile.open(cname + ".txt"); 
int numOfElements = name.size(); 

if (UserFile.is_open()) 
{ 
    name.push_back(cname); 
    pass.push_back(cpass); 
    posx.push_back(0); 
    posy.push_back(0); 
    id.push_back(numOfElements); 

    std::cout << "Your player name has been registered successfully." << std::endl; 
    UserFile << cname << ";" << cpass << ";" << "0" << ";" << "0"; 
} 

ベクトルにプレーヤーを追加しても、numOfElementsさえ正しく動作します。ベクトルのn番目の要素としてプレーヤーIDを表す各プレーヤーの統計を読み取るにはどうすればよいですか? 例:あなたはpush_backでき、ベクトル要素IDのC++

struct Player { 
    std::string name, pass; 
    int posx, posy; 
    int id; 
    // etc. 
}; 

std::vector<Player> players; 

は、このリストに新しいプレーヤーを追加するには:すべての

else if (userInput == "stats") // Ignore the else 
{ 
    // Name is Allura. ID is stored too. Increments from 0 to work with the vector 
    // What can I do to make a way of showing information only in that nth element (like element 0 if player id is 0) etc? 
} 
+0

さまざまなプロパティ(name、pass、pos)を別のベクターに保存していますか?あなたは本当に構造体の単一のベクトルを持つべきです。これはC++ – qxz

+1

あなたの質問は少し不明です。与えられた 'id'を持つプレーヤーのインデックスを探したいですか? – qxz

+0

プレーヤー1と2のレジスタがログインします。プレーヤー1にはidベクトルが格納され、プレーヤー2にはidとして1が格納されます。プレイヤー1は統計をタイプする。両方の選手の統計情報を表示したくないので、送信する情報を知るためのプログラムが必要です。さて、プレイヤー1はidベクトルに0を格納しているので、そのプレイヤーのIDを見つけて、それを名前ベクトルの配列インデックスとして使用する必要があります。名前[ID] –

答えて

1

まず、選手のリストを格納するためには、あなたは、オブジェクトの単一のベクトルを持っている必要がありますすべてのプロパティとブレース-INIT-リスト:

players.push_back({cname, cpass, 0, 0, numOfElements /*, etc. */}); 

あなたが与えられたid(またはその他のプロパティ)を持つプレーヤーを検索したい場合は、を使用これはlambda expression(PythonでラムダまたはJavaScriptで匿名関数のように)使用

int id_to_find = ...; 
auto iterator = std::find_if(players.begin(), players.end(), [&](const Player& p) { 
    return p.id == id_to_find; 
}); 
if (iterator == players.end()) { 
    // the id wasn't found 
} else { 
    // the id was found 
    // (*iterator) is a reference to the Player object in the vector 
} 

:(与えられた条件が真である最初の要素を見つけ)210。イテレーターの仕組みになじみがない場合は、それらを見てください。 C++では、インデックスを扱う代わりにほとんど常に使用されています。

+0

ありがとうqxz!はい、私は過去数日間のイテレーターについて学び、ベクトルとマップの両方でループとして使用する方法を理解していますが、現時点でポインタについてあまり理解していません。 *または&?私はそれらがあいまいに使われているのを見ました。また、なぜfind_ifプレーヤーオブジェクトの前に括弧で囲まれたアドレスポインタがso - > [&]? –

+0

私は一人で勉強していますが、もう一つ質問があります。私があなたのstructメソッドを使うつもりなら、どのようにMonsterクラスのstructを定義できますか?これは私が「void Monsters :: monsterAttack(Players&player)」のようなものを使用するところで、構造体は&で定義された関数のパラメータであるか? –

+0

ラムダ内の '[&]'はキャプチャリストと呼ばれます。それはラムダ内でどのような外部変数が利用可能になるかを定義します。 '&'を使うことはすべてのローカル変数を参照で取得することを意味します。これは 'id_to_find'を使うために必要です。 [私がリンクした記事](http://blog.smartbear.com/c-plus-plus/c11-tutorial-lambda-expressions-the-nuts-and-bolts-of-functional-programming/)には良い説明がありますラムダの詳細の – qxz

関連する問題