如何在C++中访问链表中的对象

Sta*_*uft 2 c++ linked-list object

我非常习惯使用数组和向量,但现在我正在玩一些STD :: list,以及我制作的自定义列表类.

假设我有一个简单的类,股票.

//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;
};
Run Code Online (Sandbox Code Playgroud)

现在在一个单独的文件中,我有我的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);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果这是一个向量或数组,我没有问题,我只是完全失去了相当于以下的链表:

for(int i=0; i <portfolio.size(); i++){
    portfolio[i].getSymbol();
    portfolio[i].getPrice();
 }
Run Code Online (Sandbox Code Playgroud)

或者类似的东西......我没有关于链接列表的讲座/培训,所以我真的想尽力自学 - 但我仍然坚持基本操作.我现在正在使用STL :: list,但是我也在努力创建自己的类.

Nic*_*las 6

for(int i= portfolio.begin(); i <portfolio.size(); i++)
Run Code Online (Sandbox Code Playgroud)

如果这适用于std :: vector,那只是纯粹的意外.我不知道这对矢量有什么用处.

std::any_stl_container::begin()返回一个名为"iterator"的对象.具体来说,是一个类型的对象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;
Run Code Online (Sandbox Code Playgroud)

为了遍历列表中的所有元素,您需要两个迭代器:第一个,以及列表中最后一个元素之后的元素的迭代器.幸运的是,这是由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();
}
Run Code Online (Sandbox Code Playgroud)

这适用于任何常用的STL容器.