为什么调用构造函数后 initializer_list 中的 vector<int> 的值会发生变化?
Why are the values of vector<int> inside initializer_list changing after calling the constructor?
我是 C++ 新手,正在尝试设置矩阵 class。该矩阵是根据包含 vector<int>
个条目作为矩阵行的 initializer_list
创建的。
这个class的方法之一应该是get_row(size_t rownumber)
。当我从构造函数调用实现的方法时,它 returns 是正确的结果。但是当从 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;
}
输出如下:
Called from constructor: 3 4 5 2
Called from main: 187072144 22084 5 2
谁能告诉我错误发生在哪里?非常感谢!
initializer_list
是 const
数组的轻量级视图,它不拥有(或延长其生命周期)任何元素。
当您编写 {{3, 4, 5, 2}, {7, 2, 3, 4}}
时,您是在堆栈上创建一个临时向量数组 - initializer_list
基本上是其中的指针+长度视图。构建矩阵后,该数组将被销毁。
在 matrix
实现中使用 vector
之类的容器而不是 initializer_list
来解决问题。例如
private:
vector<vector<int>>::iterator it;
vector<vector<int>> matrix;
我是 C++ 新手,正在尝试设置矩阵 class。该矩阵是根据包含 vector<int>
个条目作为矩阵行的 initializer_list
创建的。
这个class的方法之一应该是get_row(size_t rownumber)
。当我从构造函数调用实现的方法时,它 returns 是正确的结果。但是当从 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;
}
输出如下:
Called from constructor: 3 4 5 2
Called from main: 187072144 22084 5 2
谁能告诉我错误发生在哪里?非常感谢!
initializer_list
是 const
数组的轻量级视图,它不拥有(或延长其生命周期)任何元素。
当您编写 {{3, 4, 5, 2}, {7, 2, 3, 4}}
时,您是在堆栈上创建一个临时向量数组 - initializer_list
基本上是其中的指针+长度视图。构建矩阵后,该数组将被销毁。
在 matrix
实现中使用 vector
之类的容器而不是 initializer_list
来解决问题。例如
private:
vector<vector<int>>::iterator it;
vector<vector<int>> matrix;