使用std :: vector

时间:2018-05-09 16:02:02

标签: c++ matrix c++14

我正在尝试初始化一个矩阵,该矩阵被实现为双精度矢量的矢量。即,

std::vector<std::vector<double>> A {std::vector<double> {}}; 
std::vector<std::vector<double>>::iterator it = A.begin();

我的想法是使用指向每个&#34;行&#34;的指针,访问&#34; push_back&#34;通过这个指针来填满我的行。要创建新行,我只需使用:

A.push_back(std::vector<double> {});

然后让我的指针指向下一行:

it++;

然后填写我的下一行。 代码符合要求(我使用的是C ++ 14标准)。但是,当我运行它时,我得到了这个:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

请考虑以下代码:

#include <iostream>
#include <vector>

void print(std::vector<std::vector<double>> matrix)
{
  typedef std::vector<std::vector<double>> row;
  typedef std::vector<double> col;
  for(row::iterator it = matrix.begin();it!=matrix.end();it++)
  {
    for(col::iterator ti = it->begin();ti!=it->end();ti++)
    {
      std::cout << *ti << ' ';
    }
    std::cout  << '\n';
  }
}

int main()
{
  std::vector<std::vector<double>> A {std::vector<double> {}};
  std::vector<std::vector<double>>::iterator it = A.begin();
  it->push_back(1);
  it->push_back(2);
  it->push_back(3);
  A.push_back(std::vector<double> {});
  it++;
  it->push_back(4);
  it->push_back(5);
  it->push_back(6);
  print(A);
  return 0;
}

(您可能认为打印功能在编译或运行时没有错误的情况下正常工作)。

任何输入都会有所帮助。 干杯

2 个答案:

答案 0 :(得分:2)

通过调用vector<>,您的push_back()迭代器可能会失效。

A.push_back(std::vector<double> {});
//it may be invalid at this point because of new allocation in the vector
it++;

当您致电push_back()时,vector可能需要重新分配内存才能容纳新数据。这将导致先前的迭代器不再指向内存中的正确位置,并且进一步使用它们将导致未定义的行为。

如果在A.begin()之后调用push_back()以重新分配迭代器然后执行增量,那么代码将按预期工作。如:

A.push_back(std::vector<double> {});
it = A.begin();
it++;

修改

如果您想部分避免将迭代器重新分配到开头,可以使用:

it++;
it = A.insert(it,std::vector<double>{});

这将在vector<double>指向的位置之前添加新的it(在这种情况下,恰好在当前vector结束之前)。然后,这将返回存储在it中的迭代器,该迭代器将指向您刚刚插入的vector,因此您可以按原样使用代码的结果。

答案 1 :(得分:0)

如果您想将数据附加到外部矢量,您还可以执行以下操作:

std::vector<std::vector<double>> A {std::vector<double> {}};
A.back().push_back(1);
A.back().push_back(2);
A.back().push_back(3);
A.push_back(std::vector<double> {});
A.back().push_back(4);
A.back().push_back(5);
A.back().push_back(6);
print(A);

the author of the previous answer是正确的,它解决了迭代器失效的问题

对于Matrix函数的实现,您也可以使用Eigen Template Libaray