sha*_*han 9 c++ pointers iterator stl 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?
}
Run Code Online (Sandbox Code Playgroud)
或者我也应该检查是否为空?
if (it != l->end() && (*it))
{
// accessing T
int value = (*it)->value();
}
Run Code Online (Sandbox Code Playgroud)
Lih*_*ihO 11
如果你被迫使用std::list<T*> myList;,让我们说它T被定义为:
struct T
{
T(const char* cstr) : str(cstr){ }
std::string str;
};
Run Code Online (Sandbox Code Playgroud)
然后只是std::list::front用来访问第一个元素:
std::string firstStr = myList.front()->str;
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,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
}
Run Code Online (Sandbox Code Playgroud)
阅读这些问题也是值得的:
你可以在迭代它时从std :: list中删除元素吗?
不擦除std :: list :: iterator会使迭代器失效并破坏对象吗?