Являются ли векторы более строгими при проверке границ, чем массивы кучи? - PullRequest
6 голосов
/ 16 июня 2010

Насколько тщательна проверка границ для векторов по сравнению с массивами кучи?Как именно он проверяет границы и как это соотносится с проверкой массива кучи?

Ответы [ 3 ]

17 голосов
/ 16 июня 2010

A vector выполнит проверку границ, если вы используете функцию at(), например:

std::vector<int> v(5);
v.at(3) = 10; 
v.at(5) = 20; // throws an exception, std::out_of_range

Однако, если вы используете operator[], проверка границ не будет.(А доступ к несуществующим элементам приводит к неопределенному поведению.)

Следует отметить, однако, что большинство реализаций будет иметь возможность включать проверку границ для всех итераторов, что обсуждается вответы здесь .По умолчанию VS2008 и ниже имеют его в Отладке и Выпуске, VS2010 делает только в Отладке.gcc требует, чтобы вы определили _GLIBCXX_DEBUG для получения проверенных итераторов.

1 голос
/ 16 июня 2010

В типичной реализации массивы вообще не проверяются, независимо от распределения. std::vector требует проверки границ для at(). Доступ «за пределами» с помощью operator[] дает неопределенное поведение, поэтому можно также выполнять проверку границ, но это довольно необычно.

Однако, что более важно, я бы посоветовал использовать алгоритмы, которые в первую очередь устраняют проблему. Когда вы делаете что-то вроде: for (i=0; i<N; i++), для N довольно легко ошибиться. Когда вы используете algorithm(x.begin(), x.end(), ...);, гораздо легче получить разумную степень уверенности в правильности вашей логики.

1 голос
/ 16 июня 2010

То, что будет определено реализацией, векторный контракт не предоставляет никаких гарантий проверки границ. Но вы точно знаете одну вещь: она будет не хуже массива кучи .

В моей реализации sgi:

  • vector::operator[] не проверено
  • vector::at() связан проверено

Из определения файла заголовка operator[]:

  /**
   *  @brief  Subscript access to the data contained in the %vector.
   *  @param n The index of the element for which data should be
   *  accessed.
   *  @return  Read-only (constant) reference to data.
   *
   *  This operator allows for easy, array-style, data access.
   *  Note that data access with this operator is unchecked and
   *  out_of_range lookups are not defined. (For checked lookups
   *  see at().)
   */

А для vector::at():

  /**
   *  @brief  Provides access to the data contained in the %vector.
   *  @param n The index of the element for which data should be
   *  accessed.
   *  @return  Read/write reference to data.
   *  @throw  std::out_of_range  If @a n is an invalid index.
   *
   *  This function provides for safer data access.  The parameter
   *  is first checked that it is in the range of the vector.  The
   *  function throws out_of_range if the check fails.
   */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...