如何访问std::list的第一个元素
How to access the first element of std::list?
我有一个列表std::list<T *> *l;
。这个列表不是空的,它有一些值。我的问题是如何正确访问项目?我不需要遍历列表。我只要第一项。
std::list<T*>::iterator it = l->begin();
if (it != l->end())
{
// accessing T
int value = (*it)->value(); // Is this safe?
}
还是我也应该检查null ?
if (it != l->end() && (*it))
{
// accessing T
int value = (*it)->value();
}
如果你被迫使用std::list<T*> myList;
,让我们说T
被定义为:
struct T
{
T(const char* cstr) : str(cstr){ }
std::string str;
};
则使用std::list::front
访问第一个元素:
std::string firstStr = myList.front()->str;
注意,在这种情况下,myList.front()
返回对列表中第一个元素的引用,在这种情况下是对指针的引用。因此,您可以将其视为指向第一个元素的指针。
对于你关于NULL
的问题:当你使用指针容器时,一旦对象被析构,指针应该从容器中移除。一旦你开始使用指针,这通常意味着你要负责与这些指针指向的对象相关的内存管理(这就是为什么你应该尽可能选择std::list<T>
而不是std::list<T*>
的主要原因)。
比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::列表中删除元素而遍历它吗?
删除std::list::iterator不会使迭代器失效并销毁对象吗?
是否需要对list元素进行空检查完全取决于首先可以放入列表中的内容。
如果列表可能包含空指针,那么在访问该元素之前一定要检查是否为null。
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- 将参数初始化为构造函数,而不是第一个
- 无法在硬件模式下创建 SGX 安全区 - "invalid launch token"即使文档将无效的启动令牌指定为第一个