Инициализация вектора векторов фиксированного размера с назначением повышения

Имея вектор вектора фиксированного размера,

vector<vector<int> > v(10);

Я хотел бы инициализировать его так, чтобы он имел во всех элементах одномерный вектор с инициализированным значением (например, 1).

Я использовал Boost Assign следующим образом

v = repeat(10,list_of(list_of(1)));

а у меня ошибка компиляции

error: no matching function for call to ‘repeat(boost::assign_detail::generic_list<int>)’

Не могли бы вы рассказать мне, как это сделать. заранее спасибо


person saloua    schedule 29.10.2012    source источник


Ответы (4)


Это не использует boost::assign, но делает то, что вам нужно:

vector<vector<int>> v(10, vector<int>(10,1));

Это создает вектор, содержащий 10 векторов int, каждый из которых содержит 10 ints.

person juanchopanza    schedule 29.10.2012
comment
Почему там 1? - person anilbey; 20.09.2018
comment
@anibey задан вопрос об инициализации всех членов вектора значением 1. Второй параметр конструктора вектора — значение для копирования. - person Weston; 25.09.2018

Вам не нужно использовать boost для требуемого поведения. Следующее создает vector из 10 vector<int>s, где каждый vector<int> содержит 10 ints со значением 1:

std::vector<std::vector<int>> v(10, std::vector<int>(10, 1));
person hmjd    schedule 29.10.2012
comment
это был первый опубликованный ответ, это лучший ответ, и все же это не принятый ответ и не тот, за который проголосовали больше всего. вздох. жизнь несправедлива. - person dbliss; 18.10.2015
comment
Я думаю, это потому, что у него есть >>, то есть > без пробела между ними: p - person krozaine; 22.05.2017
comment
@dbliss Только что посмотрел историю редактирования, и оказалось, что ОП удалил этот ответ сразу после его загрузки. Возможно, он увидел ответ другого человека после того, как закончил свой и не хотел публиковать то же самое, что и другой человек (хотя он был первым). В любом случае, ему плохо. - person deadLock; 03.09.2020

Я просто попытаюсь объяснить это новичкам в C++. Преимущество вектора векторов mat состоит в том, что вы можете получить доступ к его элементам напрямую практически бесплатно, используя оператор [].

int n(5), m(8);
vector<vector<int> > mat(n, vector<int>(m));

mat[0][0] =4; //direct assignment OR

for (int i=0;i<n;++i)
    for(int j=0;j<m;++j){
        mat[i][j] = rand() % 10;
    }

Конечно, это не единственный способ. И если вы не добавляете и не удаляете элементы, можно также использовать нативные контейнеры mat[], которые являются не чем иным, как указателями. Вот мой любимый способ, используя С++:

int n(5), m(8);
int *matrix[n];
for(int i=0;i<n;++i){
    matrix[i] = new int[m]; //allocating m elements of memory 
    for(int j=0;j<m;++j) matrix[i][j]= rand()%10;
}

Таким образом, вам не нужно использовать #include <vector>. Надеюсь, стало понятнее!

person moldovean    schedule 30.03.2015

#include <vector>
#include <iostream>
using namespace std;


int main(){
    int n; cin >> n;
    vector<vector<int>> v(n);
    //populate
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            int number; cin >> number;
            v[i].push_back(number);
        }
    }
    // display
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << v[i][j] << " ";
        }
        cout << endl;
    }
}

Вход:

4
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44

Вывод:

11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
person Frank Hou    schedule 30.06.2017