2D vector with aligned allocator syntax problem

Viewed 27

I am completely stuck when I am trying to put the value of 2D vector into another 2D vector. The code execution just exit. Putting a little extra code to make things more clear.

int data_size_val= 8;
int n_qubits_val = ceil(log2(data_size_val));
int n_states_val = pow(2, n_qubits_val);
vector<vector<float, aligned_allocator<float> >> source_phi;

vector<vector<float>> phi_val;

for(int i=0;i< n_states_val/2;i++){
vector<float> temp;
for(int j=0;j< n_qubits_val;j++){
temp.push_back(0);
}
phi_val.push_back(temp);
}
 for(int i=0;i< n_states_val/2;i++){
    for(int j=0;j< n_qubits_val;j++){
    source_phi[i][j]= phi_val[i][j];           // This is where Code Exit execution
    }
 }

It would be really great if I can be helped to resolve this issue. I think, there is some problem with syntax of 2D vector "source_phi".

1 Answers

Your source_phi is an empty vector of empty vectors. So, the source_phi[i][j]= phi_val[i][j] assignment is attempting to assign a value to a non-existent element of a non-existent vector.

There are several ways you can handle this. One is to use the push_back and temp approach that you used when initialising the phi_val vector in the first set of nested for loops:

    //...
    for (int i = 0; i < n_states_val / 2; i++) {
        vector<float, aligned_allocator<float>> temp; // Create empty temporary...
        for (int j = 0; j < n_qubits_val; j++) {
            temp.push_back(phi_val[i][j]); // Push data into the temporary
        }
        source_phi.push_back(temp); // Now push that temp into the outer vector
    }

An alternative (and likely more efficient) approach is to call the .resize() member function on: (1) the outer vector (before the outer for loop) and (2) on the inner vectors, on each run through that loop (before the inner loop):

    source_phi.resize(n_states_val / 2); // Allocates space for each vector
    for (int i = 0; i < n_states_val / 2; i++) {
        source_phi[i].resize(n_qubits_val); // Allocates space for each element
        for (int j = 0; j < n_qubits_val; j++) {
            source_phi[i][j] = phi_val[i][j]; // The LHS now exists and can be assigned
        }
    }
Related