Инициализация vector в конструкторе

217
20 марта 2018, 01:38

Здравствуйте! Мне требуется инициализировать в конструкторе структуру типа vector(map(int,double)) (с её помощью реализуется разрежённая матрица) на основании данных о вычислительной сетке из объекта mesh. Внутри конструктора всё происходит замечательно, то есть если в конце конструктора вывести на экран размер этого вектора и его содержимое, то там всё в порядке и он не пустой. Однако после возврата в основную программу размер вектора оказывается равным нулю, то есть он становится пустым. В чём может быть дело?

класс описан в файле operators.h

#include "mesh.h"
// stores the matrix of the operator in CSR format using vector of maps
class Operator {
public:
    int     N;          // number of rows = number of columns = N
    std::vector< std::map< int, double > > x;   //sparse matrix Operator_x
    Operator(Mesh &mesh);       // constructor
};

его реализация в файле operators.cpp

#include "operators.h"
#include "mesh.h"
// constructs matrix for grad, div, rot operator
Operator::Operator(Mesh &mesh) {
    int i,j;
    // number of rows = number of nodes
    N = mesh.n;
    // allocate memory for matrix
    std::vector< std::map< int, double > > x(N);    //sparse matrix Operator_x
    // fill the matrix with values
    for ( i = 0 ; i < N ; i++ )
    {
        for ( j = 0 ; j < mesh.node[i].nb.size() ; j++ )
        {
            x[i][mesh.node[i].nb[j].num] = mesh.node[i].nb[j].norm_x / (2. * mesh.node[i].S);
        }
    }
    // здесь всё хорошо, выводится ненулевой размер и правильные элементы
    std::cout << "x.size=" << x.size() << "\n";
    for (i = 0; i < N; i++)
    for (auto it = x[i].begin(); it != x[i].end(); it++)
    {
        std::cout << "i=" << i << " j=" << it->first << " value=" << it->second << "\n";
    }
};

И наконец вызов из main(), с которым проблема

Operator A12(mesh);
//вот здесь выводится нулевой размер
std::cout << "x.size=" << A12.x.size() << "\n";
Answer 1

Потому что надо не

Operator::Operator(Mesh &mesh) {
...
   std::vector< std::map< int, double > > x(N); 

а примерно так:

Operator::Operator(Mesh &mesh):x(N) {
...
// Это не нужно!! Это локальная переменная, а не член!
// std::vector< std::map< int, double > > x(N); 
READ ALSO
Как закрыть Socket?

Как закрыть Socket?

есть отдельный поток класс который работает с Socket-омКогда я отключаю клиент он все равно продолжает работать

193
java(fx) основы

java(fx) основы

Изучаю javaХочу вызвать в консоль текст, который написан в textField

148
Сихнронизация в WEB рипложении(Java Spring)

Сихнронизация в WEB рипложении(Java Spring)

Здравствуйте, разрабатываю грубо говорю систему для автоматического проведения олимпиад и вот столкнулся с проблемой синхронизации, точне...

193