Присвоению массиву другой массив
Нужно массиву double а[n] присвоить массив double b[n]. Как реализовать? Без цикла.
Голые массивы в С++ являются некопируемыми объектами. Они не копируются ни при инициализации, ни через присваивание. (На массивы, обернутые в классы и копируемые неявно и опосредованно вместе с классом, это ограничение не распространяется.)
Поэтому присвоить массив double а[n] массиву double b[n] у вас никак не получится. Либо явный цикл, либо скрытый цикл, типа memcpy , std::copy и т.п.
Разумеется настоящие «кул хацк0ры» не удержатся от соблазна предложить такое решение
но с точки зрения языка С++ такой код нарушает правила aliasing и его поведение не определено.
C#. Массивы. Часть 3. Ссылки на массивы. Свойство Length. Присваивание массивов
Массивы. Часть 3. Ссылки на массивы. Свойство Length. Присваивание массивов
Содержание
- 1. Каким образом реализуется присваивание ссылок на массив? Как компилятор C# реализует присваивание переменных типа «массив»? Пример
- 2. Пример присваивания переменным ссылок на массив
- 3. Как определить количество элементов в массиве? Свойство Length
- 4. Какие особенности применения свойства Length для многомерных массивов?
- 5. Пример вычисления суммы элементов массива с использованием свойства Length
- 6. Каким образом можно применить свойство Length для ступенчатых массивов?
Поиск на других ресурсах:
1. Каким образом реализуется присваивание ссылок на массив? Как компилятор C# реализует присваивание переменных типа «массив»? Пример
Для любого новосозданного массива память выделяется с помощью оператора new . Это означает, что массивы есть ссылочного типа (а не типа значения). То есть, переменные типа «массив» есть ссылками на эти массивы.
После присваивания значения одной переменной (ссылки на массив) другой переменной, обе переменные будут указывать (ссылаться) на один и тот же массив. То есть, копия массива не создается.
Чтобы переменные указывали на разные участки памяти (разные массивы данных) – для любой из них нужно выделять память оператором new . Если нужно выполнить копирование данных одного массива в другой, то это нужно выполнить программным путем, например с помощью операторов цикла.
⇑
2. Пример присваивания переменным ссылок на массив
Пример. В примере объявляется массив из 20 вещественных чисел и демонстрируется операция присваивания ссылок на этот массив.
⇑
3. Как определить количество элементов в массиве? Свойство Length
Длина (количество элементов) массива может сохраняться в программе в специальных, дополнительных переменных. Поскольку, в языке C# массив есть объектом, то его длина сохраняется в свойстве Length .
⇑
4. Какие особенности применения свойства Length для многомерных массивов?
В случае многомерных массивов, свойство Length возвращает количество элементов всего массива.
⇑
5. Пример вычисления суммы элементов массива с использованием свойства Length
⇑
6. Каким образом можно применить свойство Length для ступенчатых массивов?
Для ступенчатых массивов свойство Length можно применять как для целого массива в целом, так и для каждого массива, что есть строкой ( row ).
В первом случае (для целого массива в целом) свойство Length возвращает количество строк в массиве. В случае каждой строки, свойство Length возвращает длину каждой строки.
Вопрос по приравниванию массивов в C
Предположим, у меня есть два массива целых чисел x и y, и оба они имеют длину 3. x=<0,1,2>.
Есть ли какой-либо один шаг, чтобы присвоить значения x для y. Когда я делаю y=x и пытаюсь напечатать значения y,
код не компилируется.
Я не хочу мучиться написанием цикла for и написать y[i]=x[i]
задан 20 сен ’10, 17:09
Переметка, потому что regex-negation здесь нет смысла. — Carl Norum
Пройти через боль. Компилятор может оптимизировать его до чего-то более эффективного. Для небольших массивов индивидуальное назначение по ячейке выполняется быстрее, чем цикл; и обычно быстрее, чем вызов memcpy . Накладные расходы, связанные с вызовом функции или циклом for, являются определяющим фактором. — Thomas Matthews
7 ответы
Вы можете использовать memcpy or memmove :
Вы правы, что петля внутри memcpy будет делать ту же работу. Это не означает, что код, который вы предлагаете, будет работать быстрее, а тем более, что он будет безопаснее. — Стивен Судит
На многих машинах memcpy сильно оптимизирован. Теперь, в этом случае, это всего лишь массив из 3 элементов, так что, вероятно, это не имеет значения. Почему бы не быть безопаснее? Кто-то уже отладил memcpy — если я напишу свой собственный цикл, я могу сделать ошибку. — Карл Норум
Хотя вы не можете сделать это:
Ты можешь сделать это:
Вы создаете y как указатель на массив x , а не копия x . Если изменить значения x , эти изменения также появятся при ссылке y .
Вам нужно зациклиться.
По сути, это фиксированные указатели, поэтому вы не можете просто присвоить один другому. Вы должны скопировать каждое значение.
Вот почему я не рекомендую memcpy :
Это не быстрее для любого небольшого количества элементов; скорее всего будет медленнее.
Версия memcpy, которую он использует, не включает никаких средств защиты от переполнения буфера. Даже не новичкам очень легко перепутать количество элементов с общим размером элементов, что приведет к серьезной ошибке. Менее легко испортить цикл for.
Так как это просто C, вы можете (обычно) безопасно memcpy элемент. Если бы это был C++, вы бы хотели, чтобы конструктор копирования был вызван. Это делает использование memcpy плохой привычкой.
Прямой ответ Карлу:
Да, memcpy может быть очень быстрым для больших массивов простых данных. Однако мы имеем дело не с этим.
Я не беспокоюсь о ошибках in memcpy , но легкость наличия ошибки при его использовании. Требуется подсчет байтов, но natural дело было бы в количестве элементов. А for цикл будет использовать количество элементов. На многих платформах есть более безопасные версии, которые определяют размер буфера и предотвращают перезапись; Я бы порекомендовал один из них, если это возможно, когда memcpy хорошая идея
Если бы это был массив объектов C++, например std::string затем с помощью memcpy вместо вызова конструктора копирования было бы ошибкой само по себе. Да, я понимаю, что это C, а не C++, но это не делает его хорошей идеей.
Сравните массивы на равенство в C++
В этом посте мы обсудим, как сравнивать массивы на равенство в C++.
1. Использование == оператор
Мы можем легко сравнить два std::array с использованием == оператор. Он проверяет, равно ли содержимое двух контейнеров. Рассмотрим следующий код, демонстрирующий это:
результат:
Both arrays are equal
Обратите внимание, что вы не можете сравнить два массива в стиле C, используя этот подход, поскольку он распадается на указатели на первые элементы соответствующих массивов, и в итоге мы сравниваем два адреса. Следующая программа на C++ демонстрирует это:
результат:
Both arrays are not equal
2. Использование std::equal
В качестве альтернативы мы можем использовать std::equal функция, чтобы определить, равны ли соответствующие элементы в указанных диапазонах. В следующем примере показано, как сравнить два массива с std::equal функция.
Обратите внимание на проверку длины перед вызовом std::equal функция. Это сделано для того, чтобы избежать некорректного вывода, когда второй массив содержит больше элементов, чем первый массив.