Я хотел бы проверить size()
или номер rows
в массиве std::vector()
.Размер массива std :: vector
У меня есть вектор, как
std::vector<int> vec[3];
vec.size()
не работает с указанным вектором декларации.
Я хотел бы проверить size()
или номер rows
в массиве std::vector()
.Размер массива std :: vector
У меня есть вектор, как
std::vector<int> vec[3];
vec.size()
не работает с указанным вектором декларации.
А почему 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
Массивы остаются объектами независимо от того, являются ли они определенными пользователем типами или нет. – Galik
@Galik Массивы не являются объектами в типичном объектно-ориентированном смысле, где у вас есть классы и объекты (экземпляры классов). Спецификация C++ также вызывает другие объекты, включая массивы, которые могут быть путаными. –
Спасибо за ваш ответ. Нужен ли размер вектора, то есть 'vec (3)' во время компиляции или времени выполнения, чтобы принять размер вектора через командную строку –
Попробуйте
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);
Там нет ничего присущего 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()...
(Последовательность особенно важно, если вы хотите, шаблонный код для обработки векторов и массивов .)
Вы хотите 'std :: distance (std :: begin (vec), std :: end (vec))'. В C++ 17 вы хотите 'std :: size (vec)'. –
Вы можете использовать 'sizeof (vec)/sizeof (std :: vector)'. –
Я думаю, что он хочет, чтобы он хотел vec [0] .size() + vec [1] .size() + vec [2] .size() '. В случае, если это действительно так необходимо, остерегайтесь того, что вычисление выше будет отличаться от 'vec [0] .capacity() + vec [1] .capacity() + vec [2] .capacity()' – GeorgeAl