2016-11-24 59 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都能正常工作。我怎样才能读取代表玩家id的每个玩家的统计数据作为向量中的第n个元素? 例子:向量元素ID的C++

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

您是否在不同的向量中存储不同的属性(名称,通过,pos)?你真的应该有一个结构向量;这是C++ – qxz

+1

你的问题有点不清楚。你想用给定的'id'找到玩家的索引吗? – qxz

+0

玩家1和2注册登录。玩家1有0存储在ID矢量和玩家2有1作为ID存储。玩家1类型统计。不想显示两个球员的统计数据,所以我需要该程序来知道要发送哪些信息。现在,因为玩家1在id向量中存储了0,所以我需要它找到该玩家的ID并将其用作名称向量中的数组索引。姓名[编号] –

回答

1

首先,存储的球员名单,你应该有对象的一个​​矢量:

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

std::vector<Player> players; 

要将新玩家加入到这个列表中,可以push_back一个支撑-初始化列表的所有属性:

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

然后,如果您想找到一个给定的id(或其他财产)的球员,使用std::find_if(其求使所述给定的条件为真第一个元素):

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 
} 

此使用lambda expression(像在Python的λ或在JavaScript匿名功能)。如果您不熟悉迭代器的工作方式,请仔细阅读;在C++中,它们几乎总是被使用,而不是使用索引。

+0

谢谢qxz!是的,我在过去几天了解了迭代器,并且了解了如何将它们用作向量和映射中的循环,但我现在对这些指针不太了解。何时使用*或&?我已经看到他们含糊不清地使用。另外,为什么find_if播放器对象之前的括号中的地址指针像so - > [&]? –

+0

另外一个问题,因为我一直在研究..如果我要去你的结构方法,我怎么能在Monster类中定义结构?在这里我使用了类似这样的东西:'void Monsters :: monsterAttack(Players&player)',结构是用&?定义的函数参数。 –

+0

lambda中的[&]称为捕获列表;它定义了lambda内部可用的外部变量。使用'&'表示通过引用捕获所有局部变量。这是需要能够使用'id_to_find'。 [我链接的文章](http://blog.smartbear.com/c-plus-plus/c11-tutorial-lambda-expressions-the-nuts-and-bolts-of-functional-programming/)有一个很好的解释lambda的细节。 – qxz