Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
#1

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

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

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

C++ Перенос двузначных элементов массива в новый
Сформировать новый массив из элементов массива C++
удаление элементов массива, совпадающих с элементами другого массива C++
C++ Запись элементов массива структурного типа.Из старого массива- в новый
C++ Найти сумму уникальных элементов массива
C++ Получить массив из элементов другого массива, которые кратны двум
Функция для нахождения уникальных элементов массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
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;
}
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:18  [ТС]     Новый масив из уникальных элементов другого массива #3
MrGluck, извините, а нет функции без использования std ?
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
26.11.2012, 03:21     Новый масив из уникальных элементов другого массива #4
Цитата Сообщение от Mysylega Посмотреть сообщение
MrGluck, извините, а нет функции без использования std ?
Ну, как минимум, без std::cout я не обойдусь.
Могу все оформить без STL, думаю это вам надо.
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));
}
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
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];
    }
}
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:39  [ТС]     Новый масив из уникальных элементов другого массива #7
MrGluck, спасибо, но только может я не так понял, а разве эта программа не будет копировать в новый массив все элементы из первого, только удаляя дубли ?
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
26.11.2012, 03:40     Новый масив из уникальных элементов другого массива #8
Цитата Сообщение от Mysylega Посмотреть сообщение
MrGluck, спасибо, но только может я не так понял, а разве эта программа не будет копировать в новый массив все элементы из первого, только удаляя дубли ?
Да, именно.
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:42  [ТС]     Новый масив из уникальных элементов другого массива #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Да, именно.
Ясно, спасибо, хотя мне нужно, элементы, которые повторяются вообще не брать, но думаю переделать вашу программу под меня поменяв условие будет не сложно, еще раз спасибо.
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6227 / 3472 / 424
Регистрация: 29.11.2010
Сообщений: 9,178
26.11.2012, 03:45     Новый масив из уникальных элементов другого массива #10
Цитата Сообщение от Mysylega Посмотреть сообщение
Ясно, спасибо, хотя мне нужно, элементы, которые повторяются вообще не брать, но думаю переделать вашу программу под меня поменяв условие будет не сложно, еще раз спасибо.
Стоп, я не так прочел. Да, оно копирует в новый массив лишь элементы, которые случаются не более 1 раза.

Добавлено через 1 минуту
Советовал бы прочитать про std::vector, тут неприятный вынужденный копирайт происходит, т.к. мы не знаем сколько памяти надо выделить под новый массив.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 04:05     Новый масив из уникальных элементов другого массива
Еще ссылки по теме:

Из нечётных чисел заданного массива создать новый массив и посчитать количество элементов нового массива C++
C++ Сформировать массив из положительных элементов одного массива и отрицательных элементов другого
Сформировать массив из положительных элементов одного массива и отрицательных элементов другого C++
C++ Создать массив состоящий из положительных элементов другого массива
C++ Заполнить массив суммой двух элементов другого массива

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

Или воспользуйтесь поиском по форуму:
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++;
}
 
 }
 }
Yandex
Объявления
26.11.2012, 04:05     Новый масив из уникальных элементов другого массива
Ответ Создать тему
Опции темы

Текущее время: 11:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru