我正在尝试初始化一个矩阵,该矩阵被实现为双精度矢量的矢量。即,
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;
}
(您可能认为打印功能在编译或运行时没有错误的情况下正常工作)。
任何输入都会有所帮助。 干杯
答案 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