我非常习惯使用数组和向量,但现在我正在玩一些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,但是我也在努力创建自己的类。
答案 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
}