Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Удалить одинаковые элементы в массиве!


Автор: CppDevelopeR 27.1.2008, 16:38
Значед нужно удалить из массива одинаковые(ну тоесть попалось два одинаковых, один из них удалить). Не понимаю как это сделать! Подскажите плз(желателен код)

Добавлено через 3 минуты и 50 секунд
ну помогите же

Добавлено через 8 минут и 39 секунд
омг, это же 5 минутное дело(не для меня)

Автор: JackYF 27.1.2008, 17:05
Отсортировать, пройтись по массиву, проверяя, не стоит ли за текущим элементов такой же, если нет, то скопировать элемент в новый массив, по завершению этого цикла использовать новый массив вместо старого.

Автор: MAKCim 27.1.2008, 17:06
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: CppDevelopeR 27.1.2008, 17:21
а каким способом отсортировать?

Автор: CppDevelopeR 27.1.2008, 17:40
ну помогите же

Добавлено через 4 минуты и 18 секунд
и можно код плиз?

Автор: orthrus 28.1.2008, 11:14
Цитата(CppDevelopeR @  27.1.2008,  17:21 Найти цитируемый пост)
а каким способом отсортировать?


Отсортировать можно любой, известной вам, сортировкой.

Автор: orthrus 28.1.2008, 13:15
Вот, вроде то что нужно, без сортировки:
Код

#include <iostream>
#include <iomanip>

#define SIZE 25

int main(int argc, char* argv[])
{
 int* mass = new int[SIZE];
 int size = SIZE;
 for (int i = 0; i < size; ++i) mass[i] = std::rand()%15;
 for (int i = 0; i < size; ++i) std::cout << std::setw(3)<< mass[i];
 std::cout << std::endl;
 int* uniq_mass = new int[SIZE];
 int n = 0;
 uniq_mass[n++] = mass[0];
 for (int i = 1; i < size; ++i){
     int tmp = 0;
     for (int j = (n-1); j>=0; j--){
         if (mass[i] == uniq_mass[j]) tmp++;
     }
     if (tmp == 0) uniq_mass[n++] = mass[i];
 }
 for (int i = 0; i < n; ++i) std::cout << std::setw(3)<< uniq_mass[i];
 std::cout << std::endl;
 return 0;
}


Автор: TeAnton 31.1.2008, 22:06
В C++ это все в 100 раз проще делается. Нужно это сделать через множество (set).

Код

#include <set>
#include <vector>

using namespace std;

int main()
{
    // заполняем массив и выводим его на экран
    cout << "Исходный массив" << endl;
    vector<int> a;
    for (int i = 0; i < 100; ++i)
    {
        int r = rand() % 15;
        a.push_back(r);
        cout << r << " "; 
    }
    cout << endl;
    // заполняем другой массив уникальными значениями
    cout << "Результирующий массив" << endl;
    set<int> s;
    vector<int> u;
    
    for (vector<int>::iterator i = a.begin(); i != a.end(); ++i)
    if (s.find(*i) == s.end())
    {
        s.insert(*i);
        u.push_back(*i);
        cout << *i << " ";
    }
    cout << endl;
}



А если порядок элементов не нужно сохранять, можно тупо в set инсертить.

Автор: Xenon 1.2.2008, 01:04
TeAnton, 
Раз на то пошло smile
Код

int main(int argc, char argv[]) 
{
    int buf [] = { 1, 1 ,1 ,1 ,1 ,3 , 4 ,4 ,4 ,4 ,1 ,1 ,1 };
    std::vector<int> arr(buf, buf + sizeof(buf)/sizeof(int));
    arr.resize(std::unique(arr.begin(), arr.end()) - arr.begin());
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}

Автор: TeAnton 1.2.2008, 02:14
CppDevelopeR,  хотелось бы уточнение к условию задачи, удалять если одинаковые числа рядом стоят, или не имеет значения где? Во что должна превратиться данная последовательность 1 1 1 2 2 1 3 4 в 1 2 3 4 или в 1 2 1 3 4?

Добавлено через 6 минут и 6 секунд
Xenon, тогда уж так: smile

Код

#include <iostream>
#include <iterator>
int main() 
{
    int buf [] = { 1, 2 ,1 ,2 ,2 ,3 , 4 ,4 ,4 ,4 ,1 ,1 ,1 };
    std::copy(buf, std::unique(buf, buf + sizeof(buf)/sizeof(int)), std::ostream_iterator<int>(std::cout, " "));
}


Автор: orthrus 1.2.2008, 05:13
Вот начали кто меньше строчек напишет, а человеку то нужен сам алгоритм. Он наверняка хочет понять сам процесс, проникнутся искусством программирования а вы его stl-ом напичкать пытаетесь. И наверняка код с использованием stl алгоритмов у него препод не примет.

Автор: Xenon 2.2.2008, 01:22
TeAnton, ты их не удалил ;)

Автор: TeAnton 2.2.2008, 01:26
Xenon, а что я сделал?

Автор: Xenon 2.2.2008, 01:31
Ты их сдвинл в конец smile

Автор: Dexx 2.2.2008, 01:56
Прикольно вы тут угараете!

Автор: Ripper 2.2.2008, 23:13
JackYF, а не можешь пример привести, у меня только отсортировать получилось, не пойму как в цикле прибавлять новый элемент к массиву (если массив не фиксированного размера)

Автор: TeAnton 2.2.2008, 23:14
Xenon, я просто не ресайзил массив. т.к. такой массив ресайзить нельзя.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)