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

时间:2011-07-03 06:57:28

标签: c++ object linked-list

我非常习惯使用数组和向量,但现在我正在玩一些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;
};

现在在一个单独的文件中,我有我的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 个答案:

答案 0 :(得分:6)

for(int i= portfolio.begin(); i <portfolio.size(); i++)

如果这适用于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;

为了遍历列表中的所有元素,您需要两个迭代器:第一个,以及之后的元素的迭代器列表中的最后一个元素。幸运的是,这是由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容器。

答案 1 :(得分:2)

对于std::list,您有begin()end()的迭代器:

for (list<stock>::iterator it = portfolio.begin() ; it != portfolio.end(); it++)
{
  // use 'it' to access the current element (i.e. *it)
}

答案 2 :(得分:1)

您必须使用iterators。每个STL容器都有它们,甚至是矢量。它们的行为类似于指针;它们可以用*或 - &gt;取消引用,它们可以递增,可以进行比较。

for( list<Stock>::iterator it = portfolio.begin(); it != portfolio.end(); it++ ){
    it->getSymbol();
    it->getPrice();
}

答案 3 :(得分:1)

如果您尝试计算其长度,则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
}