我将首先问这个问题,其次是动机,最后是一个说明性的代码示例,该示例将按预期进行编译和执行。
问题
如果我可以确定自己在需要使用迭代器期间不会使迭代器无效,那么持有指向迭代器的指针(例如,指向list<int>::iterator的指针)是否安全?
动机
我有多个容器,我需要从一个容器中保存的项目到另一个容器中保存的相应项目的直接交叉引用,依此类推。一个容器中的项目可能并不总是在另一个容器中具有相应的项目。
因此,我的想法是将指向容器2中元素的迭代器的指针存储在容器1中存储的元素中,依此类推。为什么?因为一旦有了迭代器,我不仅可以访问容器#2中的元素,而且如果需要,还可以擦除容器#2中的元素,等等。
如果容器#2中有一个对应的元素,我将在容器#1中的元素中存储一个指向迭代器的指针。否则,该指针将设置为NULL。现在,我可以快速检查指向迭代器的指针是否为NULL,那么在容器#2中没有相应的元素,如果非NULL,则可以继续进行访问。
因此,以这种方式存储指向迭代器的指针是否安全?
代码样例

#include <iostream>
#include <list>

using namespace std;

typedef list<int> MyContainer;
typedef MyContainer::iterator MyIterator;
typdef MyIterator * PMyIterator;

void useIter(PMyIterator pIter)
{
    if (pIter == NULL)
    {
    cout << "NULL" << endl;
    }
    else
    {
    cout << "Value: " << *(*pIter) << endl;
    }
}

int main()
{
    MyContainer myList;

    myList.push_back(1);
    myList.push_back(2);

    PMyIterator pIter = NULL;

    // Verify for NULL
    useIter(pIter);

    // Get an iterator
    MyIterator it = myList.begin();

    // Get a pointer to the iterator
    pIter = & it;

    // Use the pointer
    useIter (pIter);
}

最佳答案

迭代器通常由值处理。例如,begin()end()将返回iterator类型的实例(对于给定的迭代器类型),而不是iterator&,因此它们每次都返回值的拷贝。

您当然可以为此拷贝取一个地址,但是您不能期望对begin()end()的新调用将返回一个具有相同地址的对象,并且该地址仅在您自己保留迭代器对象时才有效。

std::vector<int> x { 1, 2, 3 };

// This is fine:
auto it = x.begin();
auto* pi = &it;

// This is not (dangling pointer):
auto* pi2 = &x.begin();

维护指向迭代器的指针很少是有意义的:迭代器已经是数据的轻量级句柄。进一步的间接定向通常表明设计不佳。特别是在您的示例中,指针毫无意义。只需传递一个普通的迭代器即可。

关于c++ - 在C++中保存指向迭代器的指针是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13971857/

10-11 23:03
查看更多