在C++中保存指向迭代器的指针是否安全?

kma*_*man 5 c++ pointers iterator

我将首先提出问题,然后再提出动机,最后是一个按预期编译和执行的说明性代码示例.

如果我可以向自己保证迭代器在我需要使用它的持续时间内不会失效,那么保持指向迭代器的指针是安全的(例如指向a的指针list<int>::iterator).

动机

我有多个容器,我需要从一个容器中保存的项目到另一个容器中保存的相应项目的直接交叉引用,依此类推.一个容器中的项目可能并不总是在另一个容器中具有相应的项目.

因此,我的想法是将指向迭代器的指针存储到容器#1中存储在容器#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);
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 13

迭代器通常按值处理.例如,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();
Run Code Online (Sandbox Code Playgroud)

维护指向迭代器的指针很少有意义:迭代器已经是数据的轻量级句柄.进一步的间接通常是设计不佳的标志.在你的例子中,指针毫无意义.只需传递一个普通的迭代器.