C++/Размер двумерного вектора

Как найти размер двумерного вектора? Пока у меня есть следующий код, который не компилируется.

#include <iostream>
#include <vector>

using namespace std;

int main()
{

    vector < vector <int> > v2d;

    for (int x = 0; x < 3; x++)
    {
        for (int y = 0; y < 5; y++)
        {
            v2d.push_back(vector <int> ());
            v2d[x].push_back(y);
        }
    }

    cout<<v2d[0].size()<<endl;
    cout<<v2d[0][0].size()<<endl;

    return 0;
}

person pandoragami    schedule 26.12.2010    source источник


Ответы (3)


Чтобы получить размер v2d, просто используйте v2d.size(). Для размера каждого вектора внутри v2d используйте v2d[k].size().

Примечание: чтобы получить полный размер v2d, просуммируйте размер каждого отдельного вектора, так как каждый вектор имеет свой собственный размер.

person Shamim Hafiz    schedule 26.12.2010

В вашем коде были ошибки, которые я исправил и прокомментировал ниже.

vector < vector <int> > v2d;

for (int x = 0; x < 3; x++)
{
    // Move push_back() into the outer loop so it's called once per
    // iteration of the x-loop
    v2d.push_back(vector <int> ());
    for (int y = 0; y < 5; y++)
    {
        v2d[x].push_back(y);
    }
}

cout<<v2d.size()<<endl; // Remove the [0]
cout<<v2d[0].size()<<endl; // Remove one [0]

v2d.size() возвращает количество векторов в двумерном векторе. v2d[x].size() возвращает количество векторов в "строке" x. Если вы знаете, что вектор прямоугольный (все «строки» имеют одинаковый размер), вы можете получить общий размер с помощью v2d.size() * v2d[0].size(). В противном случае вам нужно перебрать «строки»:

int size = 0;
for (int i = 0; i < v2d.size(); i++)
    size += v2d[i].size();

В качестве изменения вы также можете использовать итераторы:

int size = 0;
for (vector<vector<int> >::const_iterator it = v2d.begin(); it != v2d.end(); ++it)
    size += it->size();
person moinudin    schedule 26.12.2010

vector<vector<int>> не имеет полного размера, потому что каждый вектор внутри него имеет независимый размер. Вам нужно суммировать размер всех содержащихся векторов.

int size = 0;
for(int i = 0; i < v2d.size(); i++)
    size += v2d[i].size();
person Puppy    schedule 26.12.2010
comment
Вспомни страшный космос! vector<vector<int> >, а не vector<vector<int>> - person moinudin; 26.12.2010
comment
@marcog: Сколько лет вашему компилятору? Я почти уверен, что в этом не было необходимости со времен C++98. - person Puppy; 26.12.2010
comment
Требование к пространству было снято только в C++0x. Отсутствие этого является ошибкой компиляции с использованием GCC. См. ideone.com/mGdWb. - person moinudin; 26.12.2010