2016-05-06 2 views
2

Я хотел бы проверить size() или номер rows в массиве std::vector().Размер массива std :: vector

У меня есть вектор, как

std::vector<int> vec[3]; 

vec.size() не работает с указанным вектором декларации.

+2

Вы хотите 'std :: distance (std :: begin (vec), std :: end (vec))'. В C++ 17 вы хотите 'std :: size (vec)'. –

+0

Вы можете использовать 'sizeof (vec)/sizeof (std :: vector )'. –

+0

Я думаю, что он хочет, чтобы он хотел vec [0] .size() + vec [1] .size() + vec [2] .size() '. В случае, если это действительно так необходимо, остерегайтесь того, что вычисление выше будет отличаться от 'vec [0] .capacity() + vec [1] .capacity() + vec [2] .capacity()' – GeorgeAl

ответ

8

А почему vec.size() не работает, это потому, что vec не является вектором, что это массив (векторов), а также массивы в C++ не являются объектами (в смысле ООП что они не являются экземплярами класса) и поэтому не имеют функций-членов.

Если вы хотите получить результат 3 при выполнении vec.size(), то вам либо придется использовать, например. std::array:

std::array<std::vector<int>, 3> vec; 
std::cout << "vec.size() = " << vec.size() << '\n'; // Will output 3 

Или, если у вас нет std::array затем использовать вектор векторов и установить размер, вызвав правильный constructor:

std::vector<std::vector<int>> vec(3); 
std::cout << "vec.size() = " << vec.size() << '\n'; // Will output 3 
+1

Массивы остаются объектами независимо от того, являются ли они определенными пользователем типами или нет. – Galik

+0

@Galik Массивы не являются объектами в типичном объектно-ориентированном смысле, где у вас есть классы и объекты (экземпляры классов). Спецификация C++ также вызывает другие объекты, включая массивы, которые могут быть путаными. –

+0

Спасибо за ваш ответ. Нужен ли размер вектора, то есть 'vec (3)' во время компиляции или времени выполнения, чтобы принять размер вектора через командную строку –

1

Попробуйте

int Nrows = 3; 
int Ncols = 4 
std::vector<std::vector<int>> vec(Nrows); 
for(int k=0;k<Nrows;k++) 
    vec[k].resize(Ncols); 

... 

auto Nrows = vec.size(); 
auto Ncols = (Nrows > 0 ? vec[0].size() : 0); 
2

Там нет ничего присущего std::vector<int> vec[3]; сказать, где первый или вторая операция индексирования представляет собой «строки» и «столбцы» - все это зависит от вашей собственной перспективы как программиста. Тем не менее, если вы считаете, что это будет иметь 3 строки, вы можете получить этот номер, используя ...

std::extent<decltype(vec)>::value 

... для которого вам нужно #include <type_traits>. См. here.

Во всяком случае, std::array<> специально разработан, чтобы обеспечить лучшее, более последовательный интерфейс - и уже будут знакомы с std::vector:

std::array<std::vector<int>, 3> vec; 
...use vec.size()... 

(Последовательность особенно важно, если вы хотите, шаблонный код для обработки векторов и массивов .)

Смежные вопросы