Как убрать повторы в массиве c
Перейти к содержимому

Как убрать повторы в массиве c

  • автор:

Удалить из массива дубликаты элементов

Написать функцию: int arrayUnique(int array[], int size) , которая будет удалять из массива дубликаты элементов, и в конце работы вернёт новую длину массива.

Предлагаю для решения этой задачи организовать заполнение массива случайными числами. Это сократит время на ввод элементов двумерного массива. Результат работы программы показан ниже:

// new_line_array.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int arrayUnique(int *ar, int); int main(int argc, char* argv[]) < srand(time(NULL)); const int array_size = 20; // размер массива const int interval = 10; // масштаб генерируемых случайных чисел int ar[array_size]; for (int counter1 = 0; counter1 < array_size; counter1++) < ar[counter1] = rand() % interval; // заполняем массив случайными числами cout cout << "\n"; for (int counter1 = 0; counter1 < arrayUnique(ar, array_size)/*вызов функции отбора значений*/; counter1++) < cout cout int arrayUnique(int *ar, int size) // функция, определяющая элементы массива в единственном экземпляре < for (int counter1 = 0; counter1 < size; counter1++) < for (int counter2 = counter1 + 1; counter2 < size ; counter2++) < if ( ar[counter1] == ar[counter2] ) // если найден одинаковый элемент < for (int counter_shift = counter2; counter_shift < size -1; counter_shift++) < // выполнить сдвиг всех остальных элементов массива на -1, начиная со следующего элемента, после найденного дубля ar[counter_shift] = ar[counter_shift + 1]; >size -= 1; // уменьшить размер массива на 1 if (ar[counter1] == ar[counter2]) // если следующий элемент - дубль < counter2--; // выполнить переход на предыдущий элемент >> > > return size; >

CppStudio.com

8 2 4 0 6 8 9 3 7 9 7 4 9 9 3 5 1 2 2 9 8 2 4 0 6 9 3 7 5 1

Следующие статьи помогут вам в решении данной задачи:
Дата: 11.09.2012
Поделиться:

Комментарии

art_h4rd
void arr_uniq(int * mas, int & size) < for (auto i = 0; i < size; i++) < for (auto j = 0; j < size; j++) < if(i != j) < if (mas[i] == mas[j]) < swap(mas[size - 1], mas[j]); size--; >> > > >
iYasha
#include #include #include #include using namespace std; void printVector(const vector& a) < cout cout int main() < vectornums; vector end_nums; bool nums_0 = true, nums_1 = true, nums_2 = true, nums_3 = true, nums_4 = true, nums_5 = true; bool nums_6 = true, nums_7 = true, nums_8 = true, nums_9 = true; for (int i = 0; i < 10; i++) < nums.push_back((rand() % 9)/2); >printVector(nums); for (int i = 0; i < nums.size(); i++)< if (nums[i] == 0 && nums_0 == true) < end_nums.push_back(0); nums_0 = false; >if (nums[i] == 1 && nums_1 == true) < end_nums.push_back(1); nums_1 = false; >if (nums[i] == 2 && nums_2 == true) < end_nums.push_back(2); nums_2 = false; >if (nums[i] == 3 && nums_3 == true) < end_nums.push_back(3); nums_3 = false; >if (nums[i] == 4 && nums_4 == true) < end_nums.push_back(4); nums_4 = false; >if (nums[i] == 5 && nums_5 == true) < end_nums.push_back(5); nums_5 = false; >if (nums[i] == 6 && nums_6 == true) < end_nums.push_back(6); nums_6 = false; >if (nums[i] == 7 && nums_7 == true) < end_nums.push_back(7); nums_7 = false; >if (nums[i] == 8 && nums_8 == true) < end_nums.push_back(4); nums_8 = false; >if (nums[i] == 9 && nums_9 == true) < end_nums.push_back(9); nums_9 = false; >> printVector(end_nums); return 0; >
Максим Квачёв
/* * Created by IrishSilvan at 06.08.2016 * This program delete repeating elements from random matrix */ #include #include #include using namespace std; //Прототипы функций void random_massive(int, int, int); int random_number(int, int); void print_massive(int); int find_repeat(int*, int); int massive[20]; //Матрица 10x1 int main() < SetConsoleCP(1251); SetConsoleOutputCP(1251); cout > size0; if(size0 cout > n0; cout > n1; if(n0 == n1) < cout random_massive(n0,n1, size0); //Вызов функции генерации массива по заданным параметрам cout > n0; return 0; > //Функция - Генератор массива со случайными числами void random_massive(int a, int b, int size) < for(int i = 0; i < size; i++) < //Перебираем элементы в строке по индексам до 10го massive[i] = random_number(a, b); //Запись в массив случайного числа >> //Функция - Генератор случайных чисел int random_number(int N0, int N1) < int spray = N1 - N0; //Вычисление диапазона допустимых чисел int number = (N0 + (rand() % spray)); //Складываем все вместе и получаем случайное число в заданном диапазоне return number; //Возвращаем случайное число с дробной частью >//Функция - Вывод массива на экран в удобной для чтения форме void print_massive(int size) < for(int i = 0; i < size; i++) < //Перебираем элементы в строке по индексам до 10го cout > //Функция - Отсеивание повторяющихся элементов массива int find_repeat(int *matrix, int size) < bool var; int temp_massive[size]; int index = 0; for(int i = 0; i < size; i++) < int temp_el = matrix[i]; var = true; for(int s = 0; (s < size) && var; s++) < if(temp_el == temp_massive[s]) var = false; else if(s == size-1) < temp_massive[index] = matrix[i]; index++; >> > for(int i = 0; i < index; i++) < massive[i] = temp_massive[i]; >return index; >
Arthur
#include #include #include #include using namespace std; const int SZ = 20; int main() < int mas[SZ]; int i = 0; srand(time(0)); for(int x = 0; x(cout," ")); cout(cout," ")); return 0; >
Arthur

#include #include #include #include using namespace std; const int SZ = 20; int main() < int mas[SZ]; srand(time(0)); for(int x = 0; xcout

Arthur

15.12.2015 Функция удаляет все повторяющиеся элементы
#include #include #include using namespace std; const int SZ = 20; int arrayUnique(int* , const int ); int main() < int mass[SZ]; srand(time(0)); for(int x = 0; xcout int arrayUnique(int* mass, const int SZ) < int x = 0; int newmass[SZ]; int n = 0; for(x = 0; xfor(int i = 0; i

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.

�� Rust Journey: Хотите освоить язык программирования, который завоевывает мир?

�� Илон Маск, один из ведущих инноваторов нашего времени, утверждает, что за Rust будущее. А когда последний раз он ошибался в своих прогнозах? ��

✨ Не упустите свой шанс быть в авангарде IT-революции. Подписывайтесь на канал Rust Journey и начните свой путь в захватывающий мир Rust сегодня!

c++ Удаление повторяющихся элементов массива

В денном решении все одинаковые сдвигаются в хвост массива с уменьшением длины.

Хвост можно обрезать, а можно не учитывать.

for (m = 0; m < size; m++) < // cout size--; > > > 

Отслеживать
ответ дан 7 дек 2019 в 12:16
5,908 2 2 золотых знака 8 8 серебряных знаков 17 17 бронзовых знаков

Возможен вариант решения через запись уникальных значений в новый массив. Приведен код, когда ВСЕ повторяющиеся значения удаляются. При необходимости можно переработать код для удаления всех повторяющихся кроме первого (проверять все значения изначального массива с финальным массивом, а не с первичным).

 void main() < int k = 0; int i = 0; int firstSize = 0; int outSize = 0; int controlNumb = 0; setlocale(LC_ALL, "Russian"); std::cin >> firstSize; int* arrayFirst = new int[firstSize]; int* arrayOut = new int[firstSize]; for (int count = 0; count < firstSize; count++) std::cin >> arrayFirst[count]; for (int count = 0; count < firstSize; count++) arrayOut[count]=0; for (i = 0; i < firstSize; i++) //Для каждого числа в массиве < controlNumb = 1;//Обновляем контрольное значение for (k = 0; k < firstSize; k++) //проверяем каждое значение массива if ((k!=i) & (arrayFirst[i] == arrayFirst[k])) controlNumb = 0; //кроме него самого, и если какое то из них совпало, присваиваем контрольному значению 0 if (controlNumb) //если контрольное значение осталось 1, то прибавляем 1 к условному размеру Конечного массива и записываем в конец уникальное число < outSize++; arrayOut[outSize - 1] = arrayFirst[i]; >> if (!outSize) //если условный размер финального массива остался равен нулю std::cout 
Отслеживать
ответ дан 9 окт 2020 в 20:46
11 2 2 бронзовых знака

Для решения Вашей задачи есть много вариантов.

ИМХО работайте с вектором. Скопируйте Ваши данные в вектор

int *arr = new int[10]; std::vector v; . if (arr)

Для Вас я привел 2 варианта решения задачи :

1) С предварительной сортировкой и использование std::unique

2) С сохранением последовательности

#include #include #include #include int main() < // Вариант для последовательности с предворительной сортировкой std::vectorv; std::copy(std::begin(v), std::end(v), std::ostream_iterator); std::cout << std::endl; std::sort(v.begin(), v.end()); auto last = std::unique(v.begin(), v.end()); v.erase(last, v.end()); std::copy(std::begin(v), std::end(v), std::ostream_iterator); std::cout << std::endl; std::cout << std::endl; // Вариант для несоритрованной последовательности std::vectorv2; std::copy(std::begin(v2), std::end(v2), std::ostream_iterator); std::cout ; it != std::end(v2); it = std::next(it)) < for (auto sub_it; sub_it != std::end(v2); sub_it = std::next(sub_it)) < if (*sub_it == *it) < v2.erase(sub_it); --sub_it; >> > std::copy(std::begin(v2), std::end(v2), std::ostream_iterator); std::cout

Удалить все повторяющиеся элементы из массива?

Всем привет. Мне 16, 4 месяца изучаю С++ и наткнулся на такую казалось бы тривиальную задачку. Решил я ее за сутки, кое-как) Задача: Дан целочисленный массив. Необходимо просто удалить все повторяющиеся элементы. НО С УСЛОВИЕМ! НЕЛЬЗЯ использовать решения из коробки языка! Все это время я занимался процедурным программированием ну и 2 недельки ООП изучаю. В общем прошу оценить и сказать на сколько все плохо) Если не трудно, предложите свои варианты решений.
Заранее всем спасибо и добра вам!
5c570c64d50c2546941627.jpeg5c570c6d2e4a7996922472.jpeg5c570c74b0ec3830260963.jpeg

Вот рез. работы:
5c570c8ad8119184438673.jpeg 5c570c903224c251009632.jpeg

  • Вопрос задан более трёх лет назад
  • 4724 просмотра

3 комментария

Средний 3 комментария

Как убрать повторы в массиве c

Всем привет,
Мне нужно реализовать алгоритм который будет удалять из массива одинаковые значение. с помощью какого массива, я еще не опеределился..если ипользовать вектор, то производительность уменьшится? по сравнению с char? сам алгоритм я вижу так: с первого по последний элемент в массиве, проверять если там это значение или нет, и перелаживать в другой массив, а тот потом удалить, может сталкивался кто с подобной задачей, может какой-то более изяшьный алгоритм придумывал?

Re: Удаление дубликатов из массива

От: Ruweb
Дата: 12.03.07 20:34
Оценка:

хотя не в массив а в файл нужно писать, элементов в массиве будет 3-15 килобайт
Re: Удаление дубликатов из массива

От: Экселенц
Дата: 12.03.07 20:48
Оценка: 4 (2)

std::unique и не мучайся

std::vectorint> v; v.erase(std::unique(v.begin(), v.end()), v.end());

Re[2]: Удаление дубликатов из массива

От: Ruweb
Дата: 12.03.07 22:09
Оценка:

Здравствуйте, Экселенц, Вы писали:

Э>std::unique и не мучайся

Э>

Э>std::vectorint> v; Э>v.erase(std::unique(v.begin(), v.end()), v.end()); Э>

а никакой заголовочный файл добавлять не нужно?
А что у меня этот кож не работает:

vectorstring> v; v.push_back("aaa"); v.push_back("aaa"); v.push_back("bbb"); v.push_back("bbb"); v.erase( std::unique(v.begin(), v.end()), v.end() );

почему-то..почму?
Re[3]: Удаление дубликатов из массива

От: Alxndr http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 12.03.07 22:17
Оценка:

Здравствуйте, Ruweb, Вы писали:

Э>>std::unique и не мучайся

R>а никакой заголовочный файл добавлять не нужно?

std::unique требует #include

P.S. Использовать для подсветки C++-кода тег "[c#]" — моветон.

Re[2]: Удаление дубликатов из массива

От: algol about:blank
Дата: 13.03.07 00:24
Оценка:

Здравствуйте, Экселенц, Вы писали:

Э>std::unique и не мучайся
Э>

Э>std::vectorint> v; Э>v.erase(std::unique(v.begin(), v.end()), v.end()); Э>

Имхо не хватает сортировки. В случае list это будет выглядеть так:

std::list l; l.sort(); l.unique();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *