gpt4 book ai didi

c++ - 一些 vector 元素不会改变

转载 作者:行者123 更新时间:2023-11-30 01:42:00 25 4
gpt4 key购买 nike

我遇到了非常奇怪的行为,我无法解释。我希望有人能对此有所启发。

首先是代码片段:

class TContour {
public:
typedef std::pair<int,int> TEdge; // an edge is defined by indices of vertices
typedef std::vector<TEdge> TEdges;

TEdges m_oEdges;

void splitEdge(int iEdgeIndex, int iMiddleVertexIndex) {
TEdge & oEdge = m_oEdges[iEdgeIndex];
m_oEdges.push_back(TEdge(oEdge.first, iMiddleVertexIndex));
oEdge = TEdge(oEdge.second, iMiddleVertexIndex); // !!! THE PROBLEM
};

void splitAllEdges(void) {
size_t iEdgesCnt = m_oEdges.size();
for (int i=0; i<iEdgesCnt; ++i) {
int iSomeVertexIndex = 10000; // some new value, not actually important
splitEdge(i, iSomeVertexIndex);
}
};
};

当我调用 splitAllEdges() 时,原始边被更改并添加了新边(导致容器大小加倍)。一切如预期,除了 1 个原始边缘,它没有改变。如果对此有任何兴趣,它的索引是 3,值是 [1,242]。所有其他原始边都发生变化,但这条边保持不变。添加调试打印确认边缘写入了不同的值,但 m_oEdges 内容没有改变。

我有一个简单的解决方法,将有问题的行替换为 m_oEdges[iEdgeIndex] = TEdge(oEdge.end, iMiddleVertexIndex); 确实解决了问题。尽管我担心的是意外行为的原因。这可能是编译器错误(因此我还需要期待其他什么问题?),还是我忽略了代码中的一些愚蠢错误?

/usr/bin/c++ --version
c++ (Debian 4.9.2-10) 4.9.2

从 c++98 切换到 c++11 并没有改变任何东西。

最佳答案

您在 push_back 操作后使用了无效引用。

这个:

TEdge & oEdge = m_oEdges[iEdgeIndex];

获取引用。然后这个:

m_oEdges.push_back(TEdge(oEdge.start, iMiddleVertexIndex));

可能调整 vector 的大小,并在这样做时使 oEdge 引用无效。在这一点上:

oEdge = TEdge(oEdge.end, iMiddleVertexIndex);

不再定义行为,因为您使用的是悬挂引用。重用索引,而不是引用,例如:

m_oEdges[iEdgeIndex] = TEdge(m_oEdges[iEdgeIndex].end, iMiddleVertexIndex);

关于c++ - 一些 vector 元素不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com