2015-08-10 2 views
0

Если у меня есть два массива, такие какСравнить два массива назад без зная позицию последнего элемента

int a[10]; 
int b[5]={1,3,5,7,9}; 

Однако, я не сколько элементов в массиве a. Я имею в виду, что размер массива a равен 10, но a может содержать любое количество элементов от 1 до 10. Я хочу сравнить эти два массива назад. Таким образом, как я могу проверить, в какой позиции массив a начинает иметь действительный номер?

Другой вопрос: могу ли я объявить массив без его инициализации? Если я могу, то когда я вызываю элемент в массиве, он возвращает какой-то случайный мусор или просто null?

+1

Почему бы не использовать 'std :: vector'? Значит, вы знаете размер. – Jarod42

ответ

0

Вам необходимо будет найти первую действительную позицию для первой. Это C++ 14:

auto valid_pos = std::find_if(std::crbegin(a), std::crend(a), [](int val) { /*your predicate*/ }); 

bool are_equal = std::equal(std::crbegin(b), std::crend(b), valid_pos, std::crend(a)); 

Это делает использование C++ 14 свободных функций для итераторов и улучшения в std::equal, которая проверяет размер и не вызывает неопределенное поведение, в отличие от старого алгоритма 3-турецки std::equal.

О возврате из унифицированного массива: он будет возвращать случайные данные, но не нулевое значение в смысле NULL или nullptr в C++. Поскольку тип элемента - это int, а не указатель. Только указатели могут содержать значения NULL или nullptr, когда мы говорим об основных типах. Определенные пользователем типы - это еще одна история, потому что они могут быть настроены.

P.S .: При использовании C++ не используйте NULL, всегда используйте nullptr. NULL может привести к тонким ошибкам при наличии перегрузки, среди других проблем.

+2

** - 1 ** «Только указатели могут быть пустыми» - это глупая дезинформация. Также представленный код скрывает не обязательно правильное предположение об инициализации за ненужной сложностью. –

+0

Re ", в котором использование стандартной библиотеки хуже, чем запись исходных циклов", это говорит о том, что я сказал что-то вроде этого. Я нет. Вы можете опубликовать это как вопрос SO, но он, вероятно, будет закрыт быстро, как слишком широкий и основанный на мнениях. –

+0

Re "О нулевой вещи". Речь идет о утверждении, что «Только указатели могут быть пустыми». Я думаю, вы имеете в виду специальное значение nullvalue, отличное от обычных действительных значений. Но (1) это не совсем понятно читателю, который не знает о таких значениях, потому что термин * null * просто означает * zero *, (2), что это не так, как он работает с указателями в C++ (указатель на C++ nullvalue не различается, например, может быть достигнуто посредством арифметики указателя), и (3) целые числа могут быть нулевыми в обычном смысле нуля, а с некоторыми реализациями типы с плавающей запятой могут иметь специальные «недопустимые» значения в дополнение к нулю –

2

Инициализируйте свой массив (все элементы массива) с помощью некоторого известного целого числа (скажем -1), а затем перейдите через него (модифицированные индексы будут иметь значение, отличное от -1), до тех пор, пока не встретится -1. Это только временное решение. Потому что -1 также является действительным целым числом, и это может быть не точное решение проблемы. Мне бы очень хотелось получить лучшее решение от экспертов SO. Счастливый кодирования

0

С объявлением

int a[10]; 

и действительных элементов устанавливается в 1 по 10, последовательно с самого начала, вы спросите:

как я могу проверить, в каком месте действительно ли массив a имеет действительный номер?

  • Если a находится в области видимости пространства имен, то a гарантируется нулевой инициализируется, и вы можете выполнить поиск первого нуля. Будьте осторожны, чтобы не индексировать за пределы массива. std::find делает это правильно для вас.

  • В противном случае стандарт не дает никаких гарантий относительно инициализации (поскольку тип int не предоставляет такую ​​гарантию), а конец действительных данных не может быть найден в переносном контекстно-зависимом режиме. Тем не менее, вы все же можете полагаться на контекстные гарантии, в том числе на гарантии для компилятора.Например, когда вы знаете, что объект a был обнулен вашим кодом, у вас есть контекстная гарантия.

Edit: По крайней мере, два человека считают, что выше, так вводить в заблуждение, что они downvoted, потому что якобы кто-то может подумать, что наблюдаемое поведение с одной конкретной системы и компилятора, является гарантией. I.e., возможно, можно прочитать “ гарантию ” как только “ убеждение ”, а затем подумайте, что в этом ответе утверждается, что можно полагаться на убеждения. Вышеупомянутое не должно читаться с такой переинтерпретацией.

Что касается

можно объявить массив без инициализации?

Да.

Если я могу, то, когда я звоню элемент в массиве не возвращает некоторый случайный мусор или просто пустой?

См. Выше.


Все это говорит, не рекомендуется использовать std::vector вместо исходных массивов.

Он поддерживает динамическую длину для вас.

+3

-1 потому что нет такой вещи, как «контекстная гарантия». Стандарт довольно ясен: это неопределенное поведение (а не реализация). Более того, здесь задействован не только компилятор: BSD-системы нулевая память при распределении, поэтому код, который отлично работает, больше нигде не будет. –

+0

@ DanielJour: «Контекстная гарантия» не является официальным стандартным термином C++. Это обычный английский. Прошу прощения за ваш комментарий по поводу этого термина. Также извините, ваш комментарий о BSD не имеет отношения ни к чему, и бессмысленному. И ваш комментарий о том, что речь идет не только о компиляторе, это парафраз ответа, бессмысленный как причина для downvote (вы говорите, что соглашаетесь, следовательно, вы забрасываете) –

+1

«Например, когда вы знаете, что a объект был обнулен вашим кодом, [...] «Вы не можете знать это (достоверно), поэтому, предлагая его - наряду с сильным словом« гарантия »- это ИМХО крайне вводит в заблуждение. –

0

Вы можете использовать Vectors, поскольку она является достаточно гибкой, и имеет доступ к размеру и даже итератор для последнего элемента

ИЛИ если вам не нужно, чтобы получить доступ ко всем элементам, но последний элемент в массив, вы можете использовать Stacks, так как легче получить элемент в задней части стека.

Не забудьте попытаться найти другие библиотеки и не придерживаться только массивов, в большинстве случаев это упростит для вас

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