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

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

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

C++ перенос 2значных элементов массива в новый
сформировать новый массив из элементов массива C++
C++ Создать новый массив из отрицательных элементов массива У.
Создать массив из элементов другого массива, которые являются полными квадратами C++
удаление элементов массива, совпадающих с элементами другого массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
26.11.2012, 03:40     Новый масив из уникальных элементов другого массива #8
Цитата Сообщение от Mysylega Посмотреть сообщение
MrGluck, спасибо, но только может я не так понял, а разве эта программа не будет копировать в новый массив все элементы из первого, только удаляя дубли ?
Да, именно.
Mysylega
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 12
26.11.2012, 03:42  [ТС]     Новый масив из уникальных элементов другого массива #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Да, именно.
Ясно, спасибо, хотя мне нужно, элементы, которые повторяются вообще не брать, но думаю переделать вашу программу под меня поменяв условие будет не сложно, еще раз спасибо.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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++ Получить массив из элементов другого массива, которые кратны двум

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

Или воспользуйтесь поиском по форуму:
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     Новый масив из уникальных элементов другого массива
Ответ Создать тему
Опции темы

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