gpt4 book ai didi

c++ - 为什么调用构造函数后 initializer_list 中 vector 的值会发生变化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:36 25 4
gpt4 key购买 nike

我是 C++ 的新手,正在尝试设置矩阵类。矩阵是从 initializer_list 创建的包含 vector<int>条目作为矩阵的行。此类的方法之一应该是 get_row(size_t rownumber) .当我从构造函数调用实现的方法时,它返回正确的结果。但是当从 main() 调用相同的方法时,每行的前两个元素包含一些不应该在其中的巨大数字。

我假设这个问题与指针有某种关系。不过,我真的找不到在构造函数内部调用和 main 内部调用之间可以覆盖矩阵元素的位置。当我在 Eclipse 中进入 Debug模式时,指针似乎指向预期的地址......

#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_listconst 数组的轻量级 View ,它不拥有(或延长其生命周期)任何元素。

当您编写 {{3, 4, 5, 2}, {7, 2, 3, 4}} 时,您正在堆栈上创建一个临时 vector 数组 - initializer_list 基本上是它的指针+长度 View 。构建矩阵后,该数组将被销毁。

在您的matrix 实现中使用诸如vector 的容器代替initializer_list 来解决这个问题。例如

private:
vector<vector<int>>::iterator it;
vector<vector<int>> matrix;

关于c++ - 为什么调用构造函数后 initializer_list 中 vector<int> 的值会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55992721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com