调用构造函数后,为什么initializer_list中的vector <int>的值会发生变化?

时间:2019-05-05 13:59:00

标签: 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;
}

输出如下:

Called from constructor: 3 4 5 2 
Called from main: 187072144 22084 5 2

有人可以告诉我错误发生在哪里吗?非常感谢你!

1 个答案:

答案 0 :(得分:5)

initializer_listconst数组上的轻量级视图,该数组不拥有(或延长其任何元素的寿命)。

当您写{{3, 4, 5, 2}, {7, 2, 3, 4}}时,您正在堆栈上创建一个向量的临时数组-initializer_list本质上是一个指向指针+长度的视图。构造完矩阵后,该数组将被销毁。

vector实现中使用诸如initializer_list之类的容器代替matrix来解决此问题。例如

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