Почему sizeof (ar) / sizeof (ar [0]) не работает должным образом с вектором при передаче в функцию? - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь лучше узнать С ++ и натолкнулся на эту путаницу.

int simpleArraySum(const vector<int> ar) {
  int n=sizeof(ar)/sizeof(ar[0]);
  int sum=0;
    for (int i=0; i<n; i++){
      sum+=ar[i];
    }
    return sum;
}

Когда я передал вектор из 10 элементов, результат оказался ниже ожидаемого. Я проверил, что n = 6 в отличие от того, когда я использую size (), который дает n = 10. Моя путаница возникает из-за того, что способ написания кода обычно работает в основном с sizeof (ar) / sizeof (ar [0]).

Ответы [ 2 ]

4 голосов
/ 12 января 2020

При использовании "sizeof trick" никогда не обрабатывается на std::vector.

Размер std::vector объекта равен размеру std::vector сам объект, а не возможные данные, обрабатываемые вектором.

Если вы хотите получить число элементов из объекта std::vector, используйте функцию-член size.


«Уловка sizeof» работает только с реальными массивами, например,

int array[10];
std::cout << sizeof(array) / sizeof(array[0]) << '\n';  // Will print 10

Что касается проблемы, которую вы пытаетесь решить с помощью своей функции, то здесь гораздо лучше Способы обработки итераторы

for (auto i = ar.begin(); i != ar.end(); ++i)
    sum += *i;

Тогда у вас есть на основе диапазона for петель

for (auto value : ar)
    sum += value;

Наконец вы можете использовать стандартную функцию алгоритма как std::accumulate

int simpleArraySum(std::vector<int> const& ar)
{
    return std::accumulate(begin(ar), end(ar), 0);
}
1 голос
/ 12 января 2020

Почему sizeof (ar) / sizeof (ar [0]) не работает должным образом с вектором ...

sizeof(ar)/ sizeof(ar[0]) - это выражение, которое дает вам длину массив, и только массив. std::vector не является массивом. std::vector - это класс (шаблон). sizeof(std::vector) полностью не связан с количеством элементов, то есть его длиной.

Размер всех типов является постоянной времени компиляции. std::vector может содержать переменное количество элементов, которое не является постоянной времени компиляции. Поэтому размер векторного типа не может зависеть от количества элементов.

... при передаче в функцию?

Не будет работать, если не перейти в либо функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...