Я испытываю очень странное поведение, которое я не могу объяснить. Надеюсь, кто-то может пролить свет на него.Некоторые векторные элементы не меняются
Фрагмент кода первой:
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 – themagicalyang
OT: Не являются ли члены 'станд :: pair' с именем' first'/'second' (а не' start'/'end')? –
@AdrianColomitchi Уверен, что они есть, спасибо за ваше примечание. Исправлен код. – yman