簡體   English   中英

存儲std :: deque的迭代器

[英]Storing Iterators of std::deque

我試圖將雙端隊列的迭代器存儲在向量中,並且即使在從雙端隊列中刪除某些元素或將其插入到雙端隊列中時,也希望將它們保留在向量中。 這可能嗎?

我有以下代碼:

typedef struct {

int id;
int seedId;
double similarity;

} NODE_SEED_SIM;

typedef std::deque<NODE_SEED_SIM> NodesQueue;
typedef std::deque<NODE_SEED_SIM>::iterator ITRTR;
typedef std::vector<const ITRTR> PointerVec;  

void growSegments (CSG_PointCloud *pResult, IntMatrix *WdIndices, NodesQueue *NodesList, IntMatrix *Segments) {

    ITRTR nodeslistStart = (*NodesList).begin();
    int pointCount = (*WdIndices).size();
    int nodeslistSize = (*NodesList).size();

    IntVector book(pointCount);
    PointerVec pointerList (pointCount); // Vector of ITRTRs

    for (int i = 0; i < nodeslistSize; i++) {

         book [ (*NodesList)[i].id ] = 1;
         pointerList [ (*NodesList)[i].id ] = nodeslistStart + i; // REF: 2

    }

    while (nodeslistSize > 0) {

    int i = 0;
    int returnCode = 0;
    int nodeId = (*NodesList)[i].id;
    int seedId = (*NodesList)[i].seedId;
    int n_nbrOfNode = (*WdIndices)[ nodeId ].size();

    (*Segments)[ seedId ].push_back ( nodeId );
    (*NodesList).erase ( (*NodesList).begin() ); // REF: 3; This erase DOES NOT mess the pointerList
    nodeslistSize --;

    Point node;
    /*
               GET ATTRIBUTES OF NODE
            */

    for (int j = 0; j < n_nbrOfNode; j++) {

        int nborId = (*WdIndices)[nodeId][j];

        if (nborId == seedId)
            continue;

        Point neighbor;
        /*
                        GET ATTRIBUTES OF NEIGHBOUR
                    */

        double node_nbor_sim = computeSimilarity (neighbor, node);

        if (book[nborId] == 1) {

            ITRTR curr_node = pointerList[nborId]; // REF: 1

            if ( curr_node -> similarity < node_nbor_sim) {

                curr_node -> similarity = node_nbor_sim;
                NODE_SEED_SIM temp = *curr_node;
                (*NodesList).erase (curr_node); // REF: 4; This erase completely messes up the pointerList
                returnCode = insertSortNodesList (&temp, NodesList, -1);


            }

        }

    }

}

}

NodesList中的節點在其中包含一個全局ID。 但是,它們不是根據此全局ID而是按其“相似性”的降序存儲在NodesList中。 因此,稍后我想從NodesList中獲取與全局ID(代碼中的nborID)相對應的節點時,[REF:1]我通過“ pointerList”完成了該操作,在此之前我已存儲了雙端隊列的迭代器,但要根據全局ID節點[REF:2]。 在第一個擦除命令[REF:3]之后,我的pointerList保持為true,但是在下一個擦除[REF:4]中卻弄亂了。

怎么了 謝謝

我試圖將雙端隊列的迭代器存儲在向量中,並且即使在從雙端隊列中刪除某些元素或將其插入到雙端隊列中時,也希望將它們保留在向量中。 這可能嗎?

文檔中

在此處輸入圖片說明 抱歉,我將其作為圖像發布在這里,但是格式太繁瑣而無法在標記中復制!

因此,簡短的答案是: 不! 恐怕您無法安全地存儲指向存儲在std::deque中的某些元素的迭代器,而在其他地方已對其進行了更改。

其他一些相關的問答:

如果要創建iteratorsvector ,則需要執行以下操作:

#include<iostream>
#include <deque>
#include <vector>
using namespace std;
int main()
{
    deque<int> dq { 1, 2, 3, 4, 5, 6, 7, 8 };
    deque<int>::iterator it;

    vector<deque<int>::iterator> vit;
    for (it = dq.begin(); it != dq.end(); it++)
    {
        vit.push_back(it);
        cout << *it;
    }

    //note that `it` is a pointer so if you modify the `block` it points in your deque then the value will change.
    //If you delete it then you will have a segmenant fault.
    //--- Don't Do: while (!dq.empty()) { dq.pop_back(); } ---//

    for (size_t i = 0; i < vit.size(); i++)
    {
        cout << *vit[i];
    }

    system("pause");
    return 0;
}

但是,如果要在更改/刪除該iterator后保留該iterator值,則可能要創建每個iterator的副本並存儲該副本,而不是實際的iterator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM