erlebe ich sehr seltsames Verhalten, die ich nicht erklären kann. Ich hoffe, jemand könnte etwas Licht darauf werfen.Einige Vektorelemente nicht ändern
-Code-Schnipsel zuerst:
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);
}
};
};
Als ich splitAllEdges()
aufrufen, werden die ursprünglichen Kanten geändert und neue Kanten hinzugefügt werden (was die Behältergröße zu verdoppeln). Alles wie erwartet, mit Ausnahme von 1 Originalkante, die sich nicht ändert. Sollte die von Interesse sein, sein Index ist 3
und Wert ist [1,242]
. Alle anderen ursprünglichen Kanten ändern sich, aber diese bleibt unverändert. Hinzufügen von Debug-Druck bestätigt, dass die Kante mit einem anderen Wert geschrieben wird, aber m_oEdges
Inhalt ändert sich nicht.
Ich habe eine einfache Abhilfe, die problematische Zeile mit m_oEdges[iEdgeIndex] = TEdge(oEdge.end, iMiddleVertexIndex);
ersetzt das Problem nicht beheben. Obwohl meine Sorge ist, was ist die Ursache für das unerwartete Verhalten. Könnte das einen Compiler Fehler sein (also welche anderen Fragen muss ich erwarten?), Oder haben einige dumme Fehler in meinem Code, den ich übersehen?
/usr/bin/c++ --version
c++ (Debian 4.9.2-10) 4.9.2
Die Umstellung von C++ 98 auf C++ 11 hat nichts geändert.
Verweise auf Vektorelement kann nach einem Aufruf für ungültig erklärt werden – themagicalyang
OT push_back: Sind nicht die Mitglieder einer 'std :: pair' namens' first'/'second' (statt' Starten'/'Ende')? –
@AdrianColomitchi Sicher sind sie, danke für Ihre Notiz. Der Code wurde korrigiert. – yman