迭代结构向量并解除引用迭代器

时间:2014-10-30 08:16:39

标签: c++ iterator dereference

我在vector struct上进行迭代,然后尝试取消引用迭代器。我认为我错过了一些逻辑并做错了,或者只是没有正确的语法。

代码如下,包含大量调试输出:

#include <fstream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>


using namespace std;


int main()
{
    ifstream fin("gift1.in", ios::in);
    ofstream fout("gift1.out", ios::out);

    unsigned short NP;

    struct person
    {
        string name;
        unsigned int gave;
        unsigned int received;
    };

    vector<person> accounts;

    string tmp_name;

    fin >> NP;
    accounts.resize(NP);
    for (auto& i : accounts)
    {
        fin >> tmp_name;
        //fout << "Just read this name: " << tmp_name << "\n";
        i.name = tmp_name;
        i.gave = 0;
        i.received = 0;

    }

    fout << "\n";

    for (unsigned int j = 1; j <= NP; j++)
    {
        string giver_name;
        fin >> giver_name;
        fout << "Read a name #" << j << ": " << giver_name << "\n";

        auto vpit = find_if(accounts.begin(), accounts.end(), [&giver_name](const person& pers) -> bool {return pers.name != giver_name; });
        if (vpit == accounts.end())
        {
            fout << "Couldn't find this giver in accounts\n";
        }
        else
        {
            person& found = *vpit;  // the logic is probably wrong here
            fout << "\nDebug info: \n\t Giver#" << j << "; \n\t iterator->name ==" << vpit->name << "; \n\t iterator->gave == " << vpit->gave << "; \n\t iterator->received == " << vpit ->received << "\n";
            fout << "Found " << found.name << " in accounts; proceeding\n";
            //further code
    }

我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

如果要查找具有给定值的向量元素,则必须使用相等运算符

auto vpit = find_if( accounts.begin(), accounts.end(), 
                     [&giver_name] (const person& pers) { return pers.name == giver_name; } );

至于我,那么第二个循环

for (unsigned int j = 1; j <= NP; j++)
{
    string giver_name;
    fin >> giver_name;
    //...

看起来很可疑。