继续并向std向量插入数据

时间:2015-05-04 17:14:47

标签: c++ c++11 vector insert iterator

我现在更长时间地解决这个问题了。我在使用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;
}

我真的会在这里得到帮助。

1 个答案:

答案 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 }