Как получить доступ к объектам в связанном списке в C ++ - PullRequest
2 голосов
/ 03 июля 2011

Я очень полезен для работы с массивами и векторами, но теперь я играю с некоторыми STD :: списками, а также с классом пользовательских списков, который я создал.

Допустим, у меня есть простойclass, Stock.

//stock.h
class Stock{
public:
    Stock(); //default constructor
    Stock(string, double); //overloaded constructor
    void setSymbol(string); //sets stock symbol
    void setPrice(double);
    string getSymbol();
    double getPrice();        
private:
    string symbol;
    double price;
};

Теперь в отдельном файле я хочу протестировать свой int main.

#include "stock.h"
#include <list>

int main(){
    list<Stock> portfolio;

    Stock Google("GOOG", 500);
    Stock Apple("APPL", 300);
    Stock Chipotle("CMG", 200);

    portfolio.push_back(Google);
    portfolio.push_back(Apple);
    portfolio.push_back(Chipotle);
}

Теперь, если бы это был вектор или массив, у меня не было бы проблем,Я просто полностью потерялся в связанном списке, эквивалентном следующему:

for(int i=0; i <portfolio.size(); i++){
    portfolio[i].getSymbol();
    portfolio[i].getPrice();
 }

или что-то в этом роде ... У меня нет лекций / тренировок в связанных списках, поэтому я действительно пытаюсьприложу все усилия, чтобы научить себя - но я застрял на основных манипуляциях.Я сейчас использую STL :: list, но на самом деле тоже пытаюсь создать свой собственный класс.

Ответы [ 4 ]

6 голосов
/ 03 июля 2011
for(int i= portfolio.begin(); i <portfolio.size(); i++)

Если это сработало для std :: vector, это было только по чистой случайности. Я понятия не имею, как это могло бы сработать для вектора.

std::any_stl_container::begin() возвращает объект, называемый "итератор". В частности, объект типа std::any_stl_container::iterator. Итератор похож на обобщенный указатель: он ссылается на элемент в контейнере STL.

Итератор, возвращаемый begin, является итератором, который ссылается на первый элемент в списке. Вы можете перемещать итераторы как указатели. Например:

std::list<Stock> portfolio;
...
std::list<Stock>::iterator currElem = portfolio.begin();
++currElem; //Now points to the second element in the list.
Stock &secondStock = *currElem;

Чтобы перебрать все элементы списка, вам понадобятся два итератора: первый и итератор для элемента после последнего элемента в списке. К счастью, это возвращается функцией std::any_stl_container::end(). Итак, ваш цикл должен выглядеть так:

typedef std::list<Stock>::iterator StockIt;
for(StockIt i = portfolio.begin(); i != portfolio.end(); ++i) /* Prefer pre-increment with iterators */
{
    i->getSymbol();
    i->getPrice();
}

Это будет работать для любых обычных контейнеров STL.

2 голосов
/ 03 июля 2011

У вас есть итераторы как begin() и end() для std :: list также:

for (list<stock>::iterator it = portfolio.begin() ; it != portfolio.end(); it++)
{
  // use 'it' to access the current element (i.e. *it)
}
1 голос
/ 03 июля 2011

Объект типа std::list очень неэффективен, если вы пытаетесь вычислить его длину, поскольку такая операция будет иметь линейное время.

Поэтому со списками нельзя сравнивать итераторы с < и> операторов.Также не рекомендуется пытаться получить n-й элемент с оператором [].

. Также не следует смешивать begin() и size(), которые являются соответственно итератором и целым числом.

Правильный способ итерации по std::list состоит в том, чтобы использовать пару итераторов begin() и end() и увеличивать ваш итератор, пока он не достигнет end().

Итак, дваспособы:

for(std::list<stock>::const_iterator i = my_list.cbegin(); i != my_list.cend(); ++i)
{
    // access a “const stock &” object via *i
}

или

for(std.:list<stock>::iterator i = my_list.begin(); i != my_list.end(); ++i)
{
    // access a “stock &” object via *i
}
1 голос
/ 03 июля 2011

Вы должны использовать итераторов .Каждый контейнер STL имеет их, даже вектор.Они ведут себя аналогично указателям;их можно разыменовать с помощью * или ->, их можно увеличивать, их можно сравнивать.

for( list<Stock>::iterator it = portfolio.begin(); it != portfolio.end(); it++ ){
    it->getSymbol();
    it->getPrice();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...