![](/img/trans.png)
[英]Why does GCC -O3 cause infinite std::distance with filter iterators over a 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
中的某些元素的迭代器,而在其他地方已对其进行了更改。
其他一些相关的问答:
如果要创建iterators
的vector
,则需要执行以下操作:
#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.