我现在更长时间地解决这个问题了。我在使用QVector时从来没有遇到过这样的问题,但不幸的是我不能在这个问题中使用qt ......我要做的是通过2个向量,其中包含点X和Y作为双精度。我试图在预定义的点之间插入一些x和y点。问题是在第二次循环之后一切都变坏了,迭代器开始得到奇怪的值并且点一直插入到0索引中...这个迭代器的东西真的很混乱,我无法理解为什么我不能插入到我的向量中使用intiger索引。我也试过C ++ 11的方式,但没有给我任何东西。 m_x向量表示以秒为单位的时间,m_y向量表示温度。 m_x是double,但它只能取整数正值。
int CProcessData::calculateMidPoints()
{
if((0 == m_x.size()) || (0 == m_y.size()))
return 1;
std::vector<double>::iterator itX = m_x.begin();
std::vector<double>::iterator itY = m_y.begin();
double midPointY = 0;
for (uint32_t i = 0; i < (m_x.size() - 1); i++)
{
if (i != m_x[i])
{
m_x.insert(itX, (double)i);
midPointY = (m_y[i - 1] * 1 + m_y[i] * (1 / (m_x[i + 1] - m_x[i]))) /
(1 + (1 / (m_x[i + 1] - m_x[i])));
m_y.insert(itY, midPointY);
}
else
{
itX++;
itY++;
}
}
return 0;
}
我真的会在这里得到帮助。
答案 0 :(得分:1)
调用insert()
将使迭代器失效。
来自http://en.cppreference.com/w/cpp/container/vector/insert:
如果新size()大于旧容量(),则会导致重新分配。如果new size()大于capacity(),则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也无效。
insert()
函数返回插入元素的迭代器。由于这是一个有效的迭代器,您可以捕获它并将其用于下一次迭代。以下是一个如何运作的小例子:
std::vector<int> data = { 1, 2, 3, 4, 5 };
auto it = data.begin();
std::advance(it, 3);
for (int i = 0; i < 3; i++)
{
it = data.insert(it, 9);
++it;
}
data
将在for循环结束时包含{ 1, 2, 3, 9, 9, 9, 4, 5 }
。