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

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

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

Здравствуйте, помогите сделать функцию которая генерирует новый массив из элементов, которые не повторяются в другом массиву. Заранее спасибо.
http://www.cyberforum.ru/cpp-beginners/thread1962921.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 03:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Новый масив из уникальных элементов другого массива (C++):

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

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

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

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

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

10
MrGluck
Модератор
Эксперт CЭксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,237
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Эксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,237
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Эксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,237
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Эксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,237
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Эксперт С++
7981 / 4862 / 1423
Регистрация: 29.11.2010
Сообщений: 13,237
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;, поэтому...

Из нечётных чисел заданного массива создать новый массив и посчитать количество элементов нового массива
Дано целочисленный одномерный массив А , состоящий из 12 элементов . Создать...

Заполнить массив суммой двух элементов другого массива
Добрый день, не могу решить такую задачу: &quot;Объявить массив 5х10 и 5х5. Первый...


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

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

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