#include <vector>
#include <algorithm>
...
std::vector<int> array(SIZE);
std::vector<int> array2(array.size());
std::copy(array.begin(), array.end(), array2.begin());
#include <iostream>
#include <algorithm>
#include <iterator>
#include <conio.h>
using namespace std;
int main()
{
const int size = 10;
int arr[size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[size];
arr2 = copy(begin(arr), end(arr));
cout << arr << endl;
cout << arr2 << endl;
getch();
return 0;
}
#include <cstring>
...
// arr2 = copy(begin(arr), end(arr));
memcpy(arr2, arr, sizeof(int)*size);
void array_copy(int *dst, int *src, int size)
using namespace std;
void outArray(int* array, int size)
{
for (int n = 0; n < size-1; ++n)
cout << array[n] << " ";
cout << array[size-1] << endl;
}
...
// cout << arr << endl;
// cout << arr2 << endl;
outArray(arr, size);
outArray(arr2, size);
#include <iostream>
#include <algorithm>
#include <iterator>
#include <conio.h>
#include <cstring>
using namespace std;
void outArray(int *arr, int size)
{
for (int n = 0; n < size-1; ++n)
cout << arr[n] << " ";
cout << arr[size-1] << endl;
}
int main()
{
const int size = 10;
int arr[size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[size];
memcpy(arr2, arr, sizeof(int)*size);
outArray(arr, size);
outArray(arr2, size);
getch();
return 0;
}
memcpy
стоит быть осторожным. Функция дает ожидаемый результат только для тривиальных типов.memcpy
- это функция прямого копирования блоков памяти. Функция ничего не знает про инвариант объекта в памяти.std::copy
, наоборот, умеет понимать инварианты объектов и производить копирование не нарушая инвариант источника. Дополнительно, эта функция не даст скомпилировать код если тип объектов не является копируемым.std::begin
и std::end
являются частью C++11. Если тебе компилятор пишет что не может найти их объявление, значит ты просишь его собирать код используя стандарт до C++11. /*Отсортировать список: пузырьковой, методом прямого выбора, и шейкерной сортировками. Подчситать кол-во сравнений и пересылок*/
#include <iostream>
#include <cstdlib>
#include <locale>
#include <conio.h>
#include <cstring>
#define SIZE 10
using namespace std;
void random_array(int arr[SIZE]);
void bubble_sort(int arr[SIZE], int &comparison, int &transfer);
void select_sort(int arr[SIZE], int &comparison2, int &transfer2);
int main()
{
setlocale(LC_ALL, "rus");
srand(time(0)); // при каждом новом запуске программы генерирует другие случайные числа
int array[SIZE];
int array2[SIZE];
memcpy(array2, array, sizeof(int)*SIZE);
int compar = 0;
int transf = 0;
int compar2 = 0;
int transf2 = 0;
random_array(array);
bubble_sort(array, compar, transf);
for (int i = 0; i <= SIZE-1; i++)
cout << array[i] << " ";
cout << "\n";
cout << "сравнений " << compar << endl;
cout << "пересылок " << transf << endl;
cout << "\n\n";
random_array(array2);
select_sort(array2, compar2, transf2);
for (int i = 0; i <= SIZE-1; i++)
cout << array2[i] << " ";
cout << "\n";
cout << "сравнений " << compar2 << endl;
cout << "пересылок " << transf2 << endl;
cout << "\n\n";
getch();
return 0;
}
void random_array(int array[SIZE])
{
cout << "исходный массив" << endl;
for (int i=0; i<SIZE; i++)
{
array[i] = rand()%100;
cout << array[i] << " ";
}
}
void bubble_sort(int array[SIZE], int &comparison, int &transfer)
{
cout << "\nпузырьковая сортировка" << endl;
for (int i = 0; i < SIZE-1; i++)
{
for (int j = SIZE-2; j >= i; j--)
{
comparison++; // инкремент сравнений
if (array[j] > array[j+1]) // если предыдущий элемент больше следующего
{
int temp = array[j]; //
array[j] = array[j+1]; // меняю их местами
array[j+1] = temp; //
transfer++; // инкремент пересылок
}
}
}
}
/*
1. Выбираем элемент с min значением и помещаем в a[0]
2. Снова выбираем элемент с min значением из оставшихся несортированных элементов и помещаем его в a[1]
3. И т.д., с каждым несортированным элементом, до конца.
*/
void select_sort(int array2[SIZE], int &comparison2, int &transfer2)
{
int min, temp;
cout << "\nсортировка методом прямого выбора" << endl;
for (int i = 0; i < SIZE-1; i++)
{
min = i; // присваивание min индекса минимального элемента
for (int j = i+1; j < SIZE; j++)
{
if (array2[j] < array2[min]) min = j; // если текущий элемент меньше минимального, запоминаю его индекс
}
if (min == i) continue;
temp = array2[i]; //
array2[i] = array2[min]; // меняю их местами
array2[min] = temp; //
transfer2++; // инкремент пересылок
}
comparison2 = ((SIZE * SIZE) - SIZE) / 2; // сравнений
}
int array[SIZE];
int array2[SIZE];
memcpy(array2, array, sizeof(int)*SIZE);
random_array(array);
arr2 = arr;
arr2[0] = 0;
и увидите, что arr[0] тоже изменился, то есть вы получили не копию массива, а указатель на тот же участок памяти. по указателю, записанному в переменной arr
Напишите в своём примере
arr2 = arr;
*arr = 0;
*(arr+1) = -1;
printf("%p | %p | %d | %d | %d\n", arr, &(arr[0]), arr[0], arr[1], arr[2]);
00B9F714 | 00B9F714 | 0 | -1 | 3
А что же по вашему выводится в этом случае?
The lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3)
standard conversions are performed on the argument expression. After these
conversions, if the argument does not have arithmetic, enumeration, pointer,
pointer to member, or class type, the program is ill-formed.
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be
converted to an rvalue of type “pointer to T.” The result is a pointer to the first
element of the array.