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
}