首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问std::list的第一个元素?

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

Stack Overflow用户
提问于 2013-03-01 18:19:35
回答 2查看 25.7K关注 0票数 14

我有一个列表std::list<T *> *l;。此列表不为空,并且具有一些值。我的问题是如何正确访问项目?我不需要遍历列表。我只想要第一件东西。

代码语言:javascript
复制
std::list<T*>::iterator it = l->begin();

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

或者我也应该检查是否为null?

代码语言:javascript
复制
if (it != l->end() && (*it))
{
    // accessing T
    int value = (*it)->value();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-01 18:59:43

如果你被迫使用std::list<T*> myList;,假设T被定义为:

代码语言:javascript
复制
struct T
{
    T(const char* cstr) : str(cstr){ }
    std::string str;
};

然后只需使用std::list::front访问第一个元素:

代码语言:javascript
复制
std::string firstStr = myList.front()->str;

请注意,在这种情况下,myList.front()返回对列表中第一个元素的引用,在这种情况下是对指针的引用。因此,您可以将其视为指向第一个元素的指针。

关于NULL的问题:当您使用指针容器时,一旦对象被析构,指针就应该从容器中移除。一旦您开始使用指针,这通常意味着您将负责与这些指针所指向的对象相关的内存管理(这就是为什么在可能的情况下,您应该始终优先使用std::list<T>而不是std::list<T*>的主要原因)。

NULL指针更糟糕的是悬空指针:当你创建一个对象时,将它的地址存储在你的容器中,但是一旦对象被析构,你就不会从容器中删除这个地址,那么这个指针就会变得无效,并且试图访问这个指针所指向的内存将会产生。因此,不仅应该确保您的std::list不包含NULL指针,还应该确保它只包含指向仍然存在的有效对象的指针。

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

代码语言:javascript
复制
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
}

下面这些问题也值得一读:

Can you remove elements from a std::list while iterating through it?

Doesn't erasing std::list::iterator invalidates the iterator and destroys the object?

票数 16
EN

Stack Overflow用户

发布于 2013-03-01 18:23:08

是否需要对列表元素进行null检查完全取决于首先可以将哪些内容放入列表中。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15155291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档