簡體   English   中英

遍歷C ++中的自定義結構列表的小問題

[英]Small problem iterating through a list of custom struct in C++

我正在嘗試打印出由帶有迭代器的結構組成的列表,但由於迭代器無法指向我的worker.index(),所以我無法執行此操作,我是否知道自己在做錯什么?

我正進入(狀態

[錯誤]“ std :: list :: iterator”沒有名為“ index”的成員。

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

struct Soldier
{
    int index;
    bool isAlive = true;
};

int main()
{
list<Soldier>company;
list<Soldier>::iterator it;


int N;
int number_of_reports;

cin >> N;
for(int i = 0; i < N; i++)
{
    Soldier soldier;
    soldier.index = i;
    company.push_back(soldier);
}

cin >> number_of_reports;
while(number_of_reports--)
{
    for(it = company.begin(); it != company.end(); it++)
    {
        cout << it.index() << endl;
    }
}
return 0;
}

這實際上是一個棘手的問題。 我不知道您的課程設置,但是我可以看到標准庫的簡介有很多細微差別。

迭代器是一個完整的對象。 它真的對您的士兵結構一無所知。 它知道如何使用包含焊料的std :: list。 它充滿了重載運算符。 在這一點上,我可以看到水變得渾濁的地方。 因此,您尚未了解運算符重載,但是您將要使用它嗎? 您應該將迭代器視為黑匣子,因此您必須盲目遵循某些規則。 如果是這種情況,應該告訴您,迭代器可以訪問容器中的對象,而訪問該對象的唯一方法是使用魔術it->thing

如果您了解過重載,則應該指出->是迭代器重載。 操作符返回一個指向您對象的指針。 或者,至少,您可以將迭代器視為原始指針,它看起來相同。 您有沒有被介紹過指針?

而且,隨着它的出現。

for( auto& item : container )...;

是一種語言構造。 它的作用與以下命令相同:

for (it = company.begin(); it != company.end(); it++)
{
    auto& item= *it;
    std::cout << item.index << std::endl;
}

再一次,將迭代器視為指針,這次使用星號運算符。

https://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_indirection_operator

如果您打算成為一名熟練的c ++程序員,則必須學習該語言和標准庫的工作方式。

另外,請擺脫以下習慣:

using namespace std;

它應該是it.index() it->index而不是it.index()

最簡單的方法是使用范圍內的for循環

for (auto& s : company)
{
    cout << s.index << endl;
}

現場演示: https : //wandbox.org/permlink/ybiYdbGhcQEfYizH

我認為您想這樣做:

for (list<Soldier>::iterator it = company.begin(); it != company.end(); ++it)
{
    cout << it->index << endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM