2016-12-29 16 views
0

Нашли этот код, делая обзор кода:Передача указателя вместо итератора для StD :: скопировать

std::array<uint, 10> expArray2 = {92,130,169,951,634,187,377,233,865,944}; 
copy(&expArray2[0], &expArray2[10], back_inserter(expected)); 
         ^~~~Is this Undefined behavior as ArrayIndexOutOfBoundAccess? 

ли это так же, как (я предлагаю):

std::copy (expArray2, expArray2+10, expected.begin()); 

Мой коллега говорит 1.) оба одинаковы 2.) нет неопределенного поведения?

Я объяснил ему, что указатели и итераторы две different вещи, наряду с std::copy подписью:

template <class InputIterator, class OutputIterator> 
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result); 

Может кто-то пожалуйста, подтвердить/объяснить это мне , если я не прав в любом месте?

+0

Указатели являются своего рода итератора. Это даже упоминается в приведенной ссылке. – user2357112

+0

Да, но моя главная проблема - arrayIndexOutOfBoundAccess. –

+1

Кажется, что ядро ​​этого вопроса касается выражения '& expArray2 [10]'. В этом случае это выглядит актуальным: http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal-by- – TheUndeadFish

ответ

0

Ваш коллега прав.

Iterator - это концепция с требованиями (что они могут быть разыменованы и увеличены как минимум), которые указывают на полный набор.

Кроме того, диапазоны в C++ наполовину открыты, что означает, что второй (последний) итератор, переданный алгоритмам, должен быть один минута элементов, которые вы хотите включить в диапазон. Это никогда не разыменовывается (это гарантировано стандартом C++), поэтому нет UB кода, который вы опубликовали.

ПРИМЕЧАНИЕ: expected.begin() - это не то же самое, что и back_inserter(expected). С первым вам нужен контейнер, достаточно большой, чтобы держать результирующий диапазон, в то время как последний автоматически расширяет его.

+0

Возможно, вы захотите прокомментировать использование 'back_inserter (expected)' vs. 'expected.begin()'. – druckermanly

+0

@ user2899162 Сделано это. Вы правы, в этом что-то подозрительно. – jrok

+0

Эта разница, которую я знаю, вектор не предоставляется размер раньше. Так что все в порядке. –

1

std :: копия использование с std :: array совершенно применимо. В основном std :: copy работает с указателями, обозначающими диапазон ввода, поскольку указатели удовлетворяют всем требованиям итераторов ввода.

Что касается принятия начинает КОНЦА конца диапазона входного сигнала, как & expArray2 [0] и & expArray2 [10] это тоже хорошо, потому что станда :: массив гарантированно управлять им непрерывный основной массив, чтобы вы могли справиться с этим массивом, как с любым обычным массивом C-стиля.

Что касается меня, то я предпочел бы использовать зЬй :: начать и зЬй :: конец внутри станд :: скопировать:

std::copy(std::cbegin(expArray2), std::cend(expArray2), 
    std::back_inserter(expected)); 

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

  • Нет связанных вопросов^_^