kan*_*nra 4 c++ vector initializer-list
我是C ++的新手,正在尝试设置矩阵类。矩阵是从initializer_list包含vector<int>条目的矩阵行中创建的。此类的方法之一应该是get_row(size_t rownumber)。当我从构造函数调用实现的方法时,它将返回正确的结果。但是,当从中调用相同的方法时main(),每行的前两个元素包含一些不应在其中的巨大数字。
我认为问题与指针有关。虽然,我真的找不到在构造函数内部的调用和main内部的调用之间矩阵元素可以覆盖的地方。当我在Eclipse中进入调试模式时,指针似乎指向了预期的地址...
#include <iostream>
#include <vector>
using namespace std;
template<typename T> class myMatrix {
private:
initializer_list<vector<int>>::iterator it;
initializer_list<vector<int>> matrix;
public:
myMatrix(initializer_list<T> values) {
matrix = values;
vector<int> chosen_row = get_row(1);
cout << "Called from constructor: ";
for (unsigned i = 0; i != chosen_row.size(); i++) {
cout << chosen_row.at(i) << " ";
}
}
vector<int> get_row(size_t x) {
it = matrix.begin() + x - 1;
return (*it);
}
};
int main(int argc, char *argv[]) {
myMatrix<vector<int>> test{{3, 4, 5, 2}, {7, 2, 3, 4}};
vector<int> chosen_row = test.get_row(1);
cout << endl << "Called from main: ";
for (unsigned i = 0; i != chosen_row.size(); i++) {
cout << chosen_row.at(i)<< " " ;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
Called from constructor: 3 4 5 2
Called from main: 187072144 22084 5 2
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我错误发生在哪里吗?非常感谢你!
initializer_list是一个const不拥有任何元素(或延长其寿命)的数组的轻量级视图。
当您编写时{{3, 4, 5, 2}, {7, 2, 3, 4}},您正在堆栈上创建向量的临时数组- initializer_list基本上是指针+长度视图。构造完矩阵后,该数组将被销毁。
使用诸如之类的容器vector代替initializer_list在您的matrix实现内部,以解决此问题。例如
private:
vector<vector<int>>::iterator it;
vector<vector<int>> matrix;
Run Code Online (Sandbox Code Playgroud)