【问题标题】:Going through and inserting data to std vectors遍历并将数据插入标准向量
【发布时间】:2015-05-04 17:14:46
【问题描述】:

我在使用 QVector 时从来没有遇到过这种问题,但不幸的是我不能在这个中使用 qt。我要做的是通过 2 个向量,其中包含点 X 和 Y 作为双精度值。

我正在尝试在预定义的点之间插入一些 x 和 y 点。问题是,在第二个循环之后一切都变糟了,迭代器开始得到奇怪的值,并且这些点一直插入到 0 索引中。这个迭代器真的很令人困惑,我不明白为什么我不能简单地使用整数索引插入到我的向量中。我也尝试了 C++11 的方式,但没有给我任何东西。

m_x 向量以秒为单位表示时间,m_y 向量表示温度。 m_x 是双精度的,但只能取整数正值。

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;
}

【问题讨论】:

  • push_back()代替insert()怎么样?
  • 我必须在特定点之间插入。

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


【解决方案1】:

调用 insert() 将使您的迭代器无效。

来自http://en.cppreference.com/w/cpp/container/vector/insert

如果新的 size() 大于旧的 capacity(),则导致重新分配。如果新的 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 }

【讨论】:

  • 那么有解决办法吗?如何遍历向量并将单元格插入其中?
  • insert 为插入的值返回一个有效的迭代器。
  • @ŁukaszPrzeniosło insert() 返回插入元素的迭代器。您可以捕获该迭代器并将其用于下一次插入。
  • 我明白了...该死的你 c++...谢谢你们。你能不能告诉我有一种方法可以返回一个大于一个迭代器的值?或者有没有办法isertAfter?
  • 另外,比起itX++,更喜欢++itX(尽管现在现代编译器可能会为您优化未使用的临时...)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多