C++ 如何访问std::list的第一个元素?

C++ 如何访问std::list的第一个元素?,c++,list,pointers,stl,iterator,C++,List,Pointers,Stl,Iterator,我有一个列表std::list*l。此列表不是空的,并且有一些值。我的问题是如何正确访问项目?我不需要反复浏览列表。我只想要第一件 std::list<T*>::iterator it = l->begin(); if (it != l->end()) { // accessing T int value = (*it)->value(); // Is this safe? } 对list元素进行空检查的需要完全取决于首先可以放入列表中的内容 如

我有一个列表
std::list*l。此列表不是空的,并且有一些值。我的问题是如何正确访问项目?我不需要反复浏览列表。我只想要第一件

std::list<T*>::iterator it = l->begin();

if (it != l->end())
{
    // accessing T
    int value = (*it)->value(); // Is this safe?
}

对list元素进行空检查的需要完全取决于首先可以放入列表中的内容

如果列表中可能包含空指针,那么在访问元素之前,您应该检查空指针。

如果不可能,那么也没有理由检查。

如果您被迫使用
std::list myList
假设
T
定义为:

struct T
{
    T(const char* cstr) : str(cstr){ }
    std::string str;
};
然后只需使用访问第一个元素:

std::string firstStr = myList.front()->str;
请注意,在本例中,
myList.front()
返回对列表中第一个元素的引用,在本例中是对指针的引用。因此,您可以将其视为指向第一个元素的指针

关于
NULL
:当您使用指针容器时,一旦对象被破坏,指针应该从容器中移除。一旦您开始使用指针,通常意味着您将负责与这些指针指向的对象相关联的内存管理(这是您应该尽可能选择
std::list
而不是
std::list
的主要原因)

NULL
更糟糕的是,指针是悬空指针:创建对象时,将其地址存储在容器中,但一旦对象被破坏,就不会从容器中删除此地址,然后该指针将变为无效,尝试访问该指针指向的内存将产生未定义的行为。因此,您不仅应该确保
std::list
不包含
NULL
指针,还应该确保它只包含指向仍然存在的有效对象的指针

因此,在清理这些元素时,您会发现自己正在从列表中删除指针,并立即删除它们指向的对象:

std::list<T*> myList;

myList.push_back(new T("one"));
myList.push_back(new T("two"));
myList.push_back(new T("three"));
myList.push_back(new T("four"));

while (!myList.empty())
{
    T* pT = myList.front();                     // retrieve the first element
    myList.erase(myList.begin());               // remove it from my list
    std::cout << pT->str.c_str() << std::endl;  // print its member
    delete pT;                                  // delete the object it points to
}
std::list myList;
我的列表。推回(新T(“一”);
myList.push_back(新的T(“两”));
我的列表。推回(新T(“三”);
myList.push_back(新T(“四”);
而(!myList.empty())
{
T*pT=myList.front();//检索第一个元素
myList.erase(myList.begin());//将其从我的列表中删除

标准::cout str.c_str()您正在持有指针,所以检查<代码> null >代码>或使用<代码> STD::列表> <代码:STD::列表< /COD>,而不是<代码> STD::列表?@ LIHO,它甚至更好,指针指针列表!现代C++编程的第一条规则——不要使用指针。我使用的帽子返回一个指针列表的指针我不同意,你应该总是检查NULL,特别是在调试/开发版本中。如果它不应该为NULL,则抛出一个异常。@AlexChamberlain:在这种情况下,为什么不同时检查指针是否仍然引用有效的活动对象?如果我能想出一种方法,我会在调试版本中进行检查。我snt.front()当前已删除的函数?如果是,使用什么替代?
std::list<T*> myList;

myList.push_back(new T("one"));
myList.push_back(new T("two"));
myList.push_back(new T("three"));
myList.push_back(new T("four"));

while (!myList.empty())
{
    T* pT = myList.front();                     // retrieve the first element
    myList.erase(myList.begin());               // remove it from my list
    std::cout << pT->str.c_str() << std::endl;  // print its member
    delete pT;                                  // delete the object it points to
}