Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
1

Новый масив из уникальных элементов другого массива

26.11.2012, 03:09. Просмотров 850. Ответов 10
Метки нет (Все метки)

Здравствуйте, помогите сделать функцию которая генерирует новый массив из элементов, которые не повторяются в другом массиву. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 03:09
Ответы с готовыми решениями:

Подсчёт количества уникальных элементов массива
Задается количество элементов массива не более 100. Элементами массива будут...

Найти сумму уникальных элементов массива
1. Задати масив цілих чисел довжиною згідно варіанту. 2. Елементи масиву...

Функция для нахождения уникальных элементов массива
Есть функция на JS, которой передается двумерный символьный массив. Она...

Сформировать массив из положительных элементов одного массива и отрицательных элементов другого
Даны массив А и массив В, в каждом по 10 элементов. Сформировать новый массив,...

Сформировать массив из положительных элементов одного массива и отрицательных элементов другого
Даны массив А и массив В, в каждом по 10 элементов. Сформировать новый массив,...

10
MrGluck
Модератор
Эксперт CЭксперт С++
8101 / 4952 / 1436
Регистрация: 29.11.2010
Сообщений: 13,437
26.11.2012, 03:17 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstddef>
#include <algorithm>
#include <iterator>
#include <random>
#include <ctime>
 
int main ()
{
    std::mt19937 gen (time (0));
    std::uniform_int_distribution<int> uid (0, 20);
    const std::size_t N = 25;
    std::vector<int> V(N), A(N);
    std::generate (V.begin(), V.end(), [&uid, &gen] { return uid(gen); } );
    std::copy(V.begin(), V.end(), std::ostream_iterator<int> (std::cout, " ") );
    std::cout<< std::endl;
    std::sort(V.begin(), V.end());
    auto it = std::unique_copy(V.begin(), V.end(), A.begin() );
    A.resize(it - A.begin() );
    std::copy(A.begin(), A.end(), std::ostream_iterator<int> (std::cout, " ") );
    std::cout<< std::endl;
    return 0;
}
Добавлено через 1 минуту
Еще вариант с мапом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstddef>
#include <vector>
#include <algorithm>
#include <iterator>
#include <random>
#include <ctime>
#include <map>
 
int main ()
{
    std::mt19937 gen (time (0));
    std::uniform_int_distribution<int> uid (0, 20);
    const std::size_t N = 25;
    std::vector<int> V(N), A;
    std::generate (V.begin(), V.end(), [&uid, &gen] { return uid(gen); } );
    std::copy(V.begin(), V.end(), std::ostream_iterator<int> (std::cout, " ") );
    std::cout<< std::endl;
    std::map<int, int> m;
    for (auto &x: V)
        ++m[x];
    for (auto &x: m)
        if (x.second == 1) A.push_back(x.first);
    std::copy(A.begin(), A.end(), std::ostream_iterator<int> (std::cout, " ") );
    std::cout<< std::endl;
    return 0;
}
1
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:18  [ТС] 3
MrGluck, извините, а нет функции без использования std ?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8101 / 4952 / 1436
Регистрация: 29.11.2010
Сообщений: 13,437
26.11.2012, 03:21 4
Цитата Сообщение от Mysylega Посмотреть сообщение
MrGluck, извините, а нет функции без использования std ?
Ну, как минимум, без std::cout я не обойдусь.
Могу все оформить без STL, думаю это вам надо.
0
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:24  [ТС] 5
MrGluck, я делаю сейчас программу на ООП, у меня все готово, только осталось добавить в класс функцию которую я написал в первом сообщение, к сожалению я не знаю, что означает STL, вот моя функция генерации массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void gener::creat(int n,int t1,int t2)
{if (p) delete []p;
 p=new int [n];
 size=n;
 if (!p) {ShowMessage("Error");
          exit(1);}
 randomize();
 if (t1>t2) {ShowMessage("Error");
             return;}
 for(int i=0;i<size;i++)
   p[i]=random(t2+1)-random(abs(t1+1));
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
8101 / 4952 / 1436
Регистрация: 29.11.2010
Сообщений: 13,437
26.11.2012, 03:35 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <ctime>
#include <cstdlib>
 
int count_unique(int *from, const int N);
void copy_unique(int *from, const int N, int *to);
 
int main()
{
    const int N = 25;
    std::srand (time (0));
    int A[N], *B; // B is dynamic array because we don't know it's size
    for (int i=0; i < N; i++)
    {
        A[i] = rand() % 20;
        std::cout<< A[i]<< " ";
    }
    std::cout<< std::endl;
 
    int new_size = count_unique(A, N);
    B = new int[ new_size ];
    copy_unique(A, N, B);
 
    for (int i=0; i < new_size; i++)
        std::cout<< B[i]<< " ";
    std::cout<< std::endl;
    delete []B;
    return 0;
}
 
int count_unique(int *from, const int N)
{
    int new_size = 0;
    for (int i=0; i < N; i++)
    {
        int counter = 0;
        for (int j=0; j < N; j++)
            if (from[i] == from[j])
                counter++;
        if (counter == 1)
            new_size++;
    }
    return new_size;
}
 
void copy_unique(int *from, const int N, int *to)
{
    int index = 0;
    for (int i=0; i < N; i++)
    {
        int counter = 0;
        for (int j=0; j < N; j++)
            if (from[i] == from[j])
                counter++;
        if (counter == 1)
            to[index++] = from[i];
    }
}
1
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:39  [ТС] 7
MrGluck, спасибо, но только может я не так понял, а разве эта программа не будет копировать в новый массив все элементы из первого, только удаляя дубли ?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8101 / 4952 / 1436
Регистрация: 29.11.2010
Сообщений: 13,437
26.11.2012, 03:40 8
Цитата Сообщение от Mysylega Посмотреть сообщение
MrGluck, спасибо, но только может я не так понял, а разве эта программа не будет копировать в новый массив все элементы из первого, только удаляя дубли ?
Да, именно.
0
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:42  [ТС] 9
Цитата Сообщение от MrGluck Посмотреть сообщение
Да, именно.
Ясно, спасибо, хотя мне нужно, элементы, которые повторяются вообще не брать, но думаю переделать вашу программу под меня поменяв условие будет не сложно, еще раз спасибо.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8101 / 4952 / 1436
Регистрация: 29.11.2010
Сообщений: 13,437
26.11.2012, 03:45 10
Цитата Сообщение от Mysylega Посмотреть сообщение
Ясно, спасибо, хотя мне нужно, элементы, которые повторяются вообще не брать, но думаю переделать вашу программу под меня поменяв условие будет не сложно, еще раз спасибо.
Стоп, я не так прочел. Да, оно копирует в новый массив лишь элементы, которые случаются не более 1 раза.

Добавлено через 1 минуту
Советовал бы прочитать про std::vector, тут неприятный вынужденный копирайт происходит, т.к. мы не знаем сколько памяти надо выделить под новый массив.
1
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 04:05  [ТС] 11
Вот сделал функцию, только не могу понять, почему она работает не правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void nm::new_mas(void)
{
size2=0;
int n=size;
if (p1) {delete []p1;}
p1=new int [size];
if (!p1) {ShowMessage("Error");
          exit(1);
 
}
 for(int i=0;i<size;i++){
 int k=0;
 for(int j=0;j<size;j++)
  if (p[i] == p[j]) 
   k++;
  
if (k == 1)
{
p1[size2]=p[i];
size2++;
}
 
 }
 }
0
26.11.2012, 04:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 04:05

удаление элементов массива, совпадающих с элементами другого массива
Здравствуйте, помогите найти ошибку в коде; суть задачи такая: удалить элементы...

Создание нового массива из определенных элементов другого массива
Здравствуйте. Мне нужно создать одномерный массив из элементов двумерного...

Запись элементов массива структурного типа.Из старого массива- в новый
Здравствуйте.Возможно, в названии темы не совсем понятно &quot;чего я хочу&quot;, поэтому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru