遍历并将数据插入标准向量
Going through and inserting data to std vectors
我在使用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;
}
调用 insert()
将使您的迭代器失效。
来自http://en.cppreference.com/w/cpp/container/vector/insert:
Causes reallocation if the new size() is greater than the old capacity(). If the new size() is greater than capacity(), all iterators and references are invalidated. Otherwise, only the iterators and references before the insertion point remain valid. The past-the-end iterator is also invalidated.
insert()
函数 returns 插入元素的迭代器。由于这是一个有效的迭代器,您可以捕获它并将其用于下一次迭代。这是一个如何工作的小例子:
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 }
。
我在使用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;
}
调用 insert()
将使您的迭代器失效。
来自http://en.cppreference.com/w/cpp/container/vector/insert:
Causes reallocation if the new size() is greater than the old capacity(). If the new size() is greater than capacity(), all iterators and references are invalidated. Otherwise, only the iterators and references before the insertion point remain valid. The past-the-end iterator is also invalidated.
insert()
函数 returns 插入元素的迭代器。由于这是一个有效的迭代器,您可以捕获它并将其用于下一次迭代。这是一个如何工作的小例子:
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 }
。