135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,331
Записей в блоге: 3
1

Можно ли создать массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться int и т.д.?

10.08.2019, 23:35. Показов 6052. Ответов 119

Такой вопрос: я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14 будет храниться int. Я видел пример со структурами как раз на этом форуме, но я потерял ссылку на сайт? Можно ли создать такой массив и какими способами?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2019, 23:35
Ответы с готовыми решениями:

Создать базу из трех сотрудников, где будут храниться их имена
суть задачи: нужно создать базу из трех сотрудников, где будут храниться их имена, з.п, должности,...

Можно ли в com-сервере создать массив в котором будут храниться данные какое-то время
Можно ли в com-сервере сделать так, чтобы одна из процедур выполняла вычисления и заносила их в...

Создать массив, содержащий массивы, которые, в свою очередь, содержат массивы, в которых уже будут храниться различные типы данных
Мне нужно создать массив, содержащий массивы, которые, в свою очередь, содержат массивы, в которых...

Создать централизованную базу данных, где будут храниться все клиенты, всех офисов
Доброго времени суток ! Есть проблема одна. Несколько офисов, работают ведут учет клиентов в...

119
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
10.08.2019, 23:55 2
Nexi99, да легко. Создаёшь класс, который имеет перегруженную операцию индексации и вуаля.

Добавлено через 41 секунду
В С++17 появились ещё tupl: https://ru.cppreference.com/w/cpp/utility/tuple.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Nexi99 Посмотреть сообщение
но я потерял ссылку на сайт?
Ты в этом даже не уверен?

1
357 / 224 / 120
Регистрация: 25.06.2019
Сообщений: 828
10.08.2019, 23:57 3
а нафига это надо?
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
struct str
{
    int type;
    double d;
    bool b;
    int i;
};
void main(int argc,char **argv)
{
    srand(unsigned(time(0)));
    str a[15];
    for(int i=0; i<15; i++)
    {
        int x=rand();
        a[i].type=i<5?0:i<10?1:2;
        if(!a[i].type) a[i].d=x/10.;
        else if(a[i].type==1) a[i].b=x>50;
            else a[i].i=x;
    }
    for(int i=0; i<15; i++)
        if(!a[i].type) cout<<a[i].d<<" ";
        else if(a[i].type==1) cout<<a[i].b<<" ";
            else  cout<<a[i].i<<" ";
    cout<<endl;
2
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,331
Записей в блоге: 3
11.08.2019, 00:57  [ТС] 4
А создать такой массив с одним именем нельзя?
0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
11.08.2019, 01:17 5
Цитата Сообщение от Nexi99 Посмотреть сообщение
Можно ли создать массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться int и т.д.?
нет, в массиве по определению хранятся однотипные и смежные элементы, но есть класс std::any, нужна поддержка стандарта C++17.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <any> // C++17
 
int main()
{
    std::any a[3] {};
 
    a[0] = 0.;
    a[1] = false;
    a[3] = 0;
 
    std::cout << a[0].type().name() << std::endl;
    std::cout << a[1].type().name() << std::endl;
    std::cout << a[2].type().name() << std::endl;
 
    return 0;
}
2
4208 / 2749 / 399
Регистрация: 01.06.2013
Сообщений: 5,807
Записей в блоге: 9
11.08.2019, 01:20 6
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
Создаёшь класс, который имеет перегруженную операцию индексации и вуаля.
А возвращать какой тип? Через union?
Цитата Сообщение от Pvt Посмотреть сообщение
а нафига это надо?
Это главный вопрос. Не надо. Лучше массивы разных типов в одну структуру завернуть.
0
Продавец времени
5622 / 3081 / 712
Регистрация: 12.03.2015
Сообщений: 14,850
11.08.2019, 04:00 7
Цитата Сообщение от Nexi99 Посмотреть сообщение
я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14 будет храниться int.
Давай, расскажи мне, для воплощения какой сексуальной фантазии ты намерен использовать эту аццкую вундервафлю?
А то не интересно.
2
357 / 224 / 120
Регистрация: 25.06.2019
Сообщений: 828
11.08.2019, 07:06 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct str
{
    int type;
    char n[sizeof(double)];
};
void main(int argc,char **argv)
{
    srand(unsigned(time(0)));
    str a[15];
    for(int i=0; i<15; i++)
    {
        int x=rand();
        a[i].type=i<5?0:i<10?1:2;
        if(!a[i].type) *(double*)a[i].n=x/10.;
        else if(a[i].type==1) *(bool*)a[i].n=x>15000;
            else *(int*)a[i].n=x;
    }
    for(int i=0; i<15; i++)
        if(!a[i].type) cout<<*(double*)a[i].n<<" ";
        else if(a[i].type==1) cout<<*(bool*)a[i].n<<" ";
            else  cout<<*(int*)a[i].n<<" ";
    cout<<endl;
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,046
11.08.2019, 09:21 9
Nexi99, привет!
Цитата Сообщение от Nexi99 Посмотреть сообщение
я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14 будет храниться int
Я не советую такое делать. Чисто экспериментально можно через std::any, как предложил _stanislav, можно через std::valiant, как предлагаю я. Так как мы знаем какие именно типы может принимать элемент массива.
Для работы этого кода также нужна поддержка C++17, так как std::variant доступен в C++ начиная с 17 стандарта.
Присоединяюсь к Verevkin: для чего тебе нужна такая сущность? Мне интересно.
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
В С++17 появились ещё tupl
Извини, но я не знаю, как здесь (в рамках этой задачи) std::tuple использовать: 1 элемент кортежа заполнен, в остальных заглушки? Я честно не пойму, что ты имел ввиду, говоря про std::tuple в этом вопросе.

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
#include <iostream>
#include <variant>
 
using double_bool_int = std::variant<double, bool, int>;
 
int main()
{
    const size_t len = 15u;
 
    double_bool_int* arr = new double_bool_int[len];
    for (size_t idx = 0u; idx < 5u; ++idx)
        arr[idx] = static_cast<double>(0.5 * idx);
    for (size_t idx = 5u; idx < 10u; ++idx)
        arr[idx] = static_cast<bool>(idx & 1u);
    for (size_t idx = 10u; idx < 15u; ++idx)
        arr[idx] = static_cast<int>(2 * idx);
    for (auto it = arr; it != arr + len; ++it)
    {
        if (auto d = std::get_if<int>(it); d)
            std::cout << "int " << *d << "\n";
        else if (auto d = std::get_if<double>(it); d)
            std::cout << "double " << *d << "\n";
        else if (auto d = std::get_if<bool>(it); d)
            std::cout << "bool " << std::boolalpha << *d << "\n";
    }
 
    return 0;
}
0
Миниатюры
Можно ли создать массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться int и т.д.?  
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,046
11.08.2019, 10:02 10
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
В С++17 появились ещё tupl
std::tuple появился в C++11, на сколько я знаю. В C++17 сделали возможным автоматический вывод типа шалона для std::tuple, std:: pair и иных классов.
До C++17
C++
1
std::tuple<int, bool, double> t(5, true, 0.14);
С C++17
C++
1
std::tuple t(5, true, 0.14);
Добавлено через 16 минут
std::variant представляет обновлённую версию union, к которой прикручен механизм сообщающий какого типа значение хранится в конкретно взятом объединении.
std::variant похож на std::tuple при объявлении
C++
1
2
std::variant<double, bool, int> v(14.25);
std::tuple<double, bool, int> v(5.7, true, 14);
Различие в том, что
кортеж (std::tuple) обязан иметь все значения, что указаны в шаблоне в соответствии по типам (первое double, второе bool, третье int),
а std::variant имеет одно значение типа одного из шаблонов или double или bool или int, но оно обязательно должно быть.
0
93 / 78 / 23
Регистрация: 19.10.2013
Сообщений: 480
11.08.2019, 11:17 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
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
59
60
61
62
63
#include <iostream>
 
using namespace std;
 
#define DECLARE_METHODS(_typename,_type,_union,_getter) \
    void operator =(_typename v) { type = _type; u._union = v; } \
    _typename _getter() const { return u._union; }
 
struct Variant
{
    enum Type {
        Int, Double, Bool
    };
 
    Type type;
 
    DECLARE_METHODS(int, Int, i, toInt)
    DECLARE_METHODS(double, Double, d, toDouble)
    DECLARE_METHODS(bool, Bool, b, toBool)
 
private:
    union {
        int i;
        double d;
        bool b;
    } u;
};
 
int main()
{
    const int size = 6;
 
    Variant vList[size];
 
    vList[1] = 1;
    vList[2] = 2;
 
    vList[3] = 0.1;
    vList[4] = 0.2;
 
    vList[5] = true;
    vList[6] = false;
 
    for (int i = 0; i < size; i++) {
        Variant v = vList[i];
 
        switch (v.type) {
        case Variant::Int:
            printf("%d\n", v.toInt());
            break;
 
        case Variant::Double:
            printf("%.1f\n", v.toDouble());
            break;
 
        case Variant::Bool:
            printf("%s\n", v.toBool() ? "true" : "false");
            break;
        }
    }
 
    return 0;
}
1
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,046
11.08.2019, 12:52 12
Я подредактировал свой код.
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <variant>
 
using double_bool_int = std::variant<double, bool, int>;
 
int main()
{
    const size_t len = 15u;
    double_bool_int* arr = new double_bool_int[len];
 
    {
        size_t idx = 0u;
        for (; idx < 5u; ++idx)
            arr[idx] = static_cast<double>(0.5 * idx);
        for (; idx < 10u; ++idx)
            arr[idx] = static_cast<bool>(idx & 1u);
        for (; idx < 15u; ++idx)
            arr[idx] = static_cast<int>(2 * idx);
    }
    for (auto it = arr; it != arr + len; ++it)
    {
        if (const auto i = std::get_if<int>(it); i)
            std::cout << "int " << *i << "\n";
        else if (const auto d = std::get_if<double>(it); d)
            std::cout << "double " << *d << "\n";
        else if (const auto b = std::get_if<bool>(it); b)
            std::cout << "bool " << std::boolalpha << *b << "\n";
    }
    
    delete[] arr;
    return 0;
}
0
Модератор
Эксперт по электронике
8478 / 6305 / 854
Регистрация: 14.02.2011
Сообщений: 21,855
11.08.2019, 12:59 13
Цитата Сообщение от Nexi99 Посмотреть сообщение
Такой вопрос: я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14 будет храниться int.
нет нельзя
массив по своему определению ГОМОГЕННЫЙ, сиречь содержит одинаковые члены
то что ты хочешь это структура,класс, все что угодно только не массив
1
93 / 78 / 23
Регистрация: 19.10.2013
Сообщений: 480
11.08.2019, 13:47 14
Цитата Сообщение от ValeryS Посмотреть сообщение
то что ты хочешь это структура,класс, все что угодно только не массив
То что он хочет - это как раз таки массив, а какой тип он "содержит" - это уже другой вопрос. Выше и привели несколько примеров структур, которые могут хранить разные типы данных. Создаём МАССИВ структур и получаем ответ на вопрос.
0
Модератор
Эксперт по электронике
8478 / 6305 / 854
Регистрация: 14.02.2011
Сообщений: 21,855
11.08.2019, 15:21 15
Цитата Сообщение от WxMaper Посмотреть сообщение
То что он хочет - это как раз таки массив,
массив состоит из однородных членов!
обращение к массиву
a[i]=*(a+i)
как будешь обращаться если размеры элементов разные?
Цитата Сообщение от WxMaper Посмотреть сообщение
Создаём МАССИВ структур
массив структур и массив разношерстных элементов это все таки разные вещи ?
этак и с объединениями могу зафигачить
0
93 / 78 / 23
Регистрация: 19.10.2013
Сообщений: 480
11.08.2019, 15:27 16
Цитата Сообщение от ValeryS Посмотреть сообщение
массив структур и массив разношерстных элементов это все таки разные вещи ?
Массив он, как говорится, и в африке массив
Вы же не будете утверждать, что int list[10]; - массив, а MySuperType list[10]; - не массив?

Цитата Сообщение от ValeryS Посмотреть сообщение
этак и с объединениями могу зафигачить
В этом и прелесть C++ - фигачте как умеете, лишь бы это работало и выполняло требуемые условия. А топикстартер посмотрит на все возможные варианты и, возможно, определится что конкретно он хотел: массив структур или массив «разношерстных элементов» и поймёт что можно, а что нельзя.
0
Модератор
Эксперт по электронике
8478 / 6305 / 854
Регистрация: 14.02.2011
Сообщений: 21,855
11.08.2019, 15:45 17
Цитата Сообщение от WxMaper Посмотреть сообщение
Вы же не будете утверждать, что int list[10]; - массив, а MySuperType list[10]; - не массив?
нет не буду
а вот double[5]bool[5]int[5] (даже не знаю как написать),массивом точно не является
А ТС именно это и надо
Цитата Сообщение от Nexi99 Посмотреть сообщение
я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14 будет храниться int.
следовательно ТС не знает что такое массив и объяснить это ему наша задача
для решения задачи(какой?) выбран неправильный инструментарий
вполне возможно что правильней описать три массива
C++
1
2
3
double arr1[5];
bool     arr2[5]; 
int       arr3[5];
может массив указателей
C++
1
void * arr[15];
но это
C++
1
2
3
4
5
6
7
 union {
         double d;
         bool b;
        int i;
    } u;
 
u arr[15];
явный костыль, который неизвестно когда выстрелит
0
93 / 78 / 23
Регистрация: 19.10.2013
Сообщений: 480
11.08.2019, 16:17 18
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот double[5]bool[5]int[5] (даже не знаю как написать)
Так зачем выдумывать то, о чем тут и не идет речи?

Цитата Сообщение от ValeryS Посмотреть сообщение
следовательно ТС не знает что такое массив
У нас тут шоу "угадай-ка"? Если так, то пардон.

Цитата Сообщение от ValeryS Посмотреть сообщение
вполне возможно что правильней описать три массива
Вопрос поставлен вполне четко и ясно:
Можно ли создать массив в котором ... будут храниться double, int и т.д.?
и ответ на этот вопрос никак не «Нет нельзя». Если у ТС стоит задача засунуть в один массив разные типы, значит у него стоит задача создать один массив и засунуть в него разные типы (гениально).

Цитата Сообщение от ValeryS Посмотреть сообщение
явный костыль

Не по теме:

Хорошо когда есть c++11/17/20 - можно базовые вещи называть костылями, особенно когда не знаешь как с ними работать :)


Есть тип variant, который в каждой библиотеке реализован по своему, но как правило там используется union. Никому никогда не приходило в голову называть этот тип костылём. И миллионы других библиотек работают с этими variant и ни у кого ничего не стреляет: QVariant::Private:ata
С приходом новых стандартов этот тип возможно и модернизировался шаблонами или всякими std::tuple и т.д., но никак не потому что union - это костыль, просто с ним сложнее/неудобнее работать. Нужно заново выделять память при смене типа данных в union, освобождать её - всё "вручную". Но это не костыль, а особенность работы с конкретным типом данных.

Цитата Сообщение от ValeryS Посмотреть сообщение
явный костыль, который неизвестно когда выстрелит
Если так мыслить, то весь С++ - явный костыль. Используйте PHP.
0
Модератор
Эксперт по электронике
8478 / 6305 / 854
Регистрация: 14.02.2011
Сообщений: 21,855
11.08.2019, 16:31 19
Цитата Сообщение от WxMaper Посмотреть сообщение
Так зачем выдумывать то, о чем тут и не идет речи?
еще раз
Цитата Сообщение от Nexi99 Посмотреть сообщение
я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14 будет храниться int.
не массив структур, не массив объединений, а именно массив разношерстных данных
1
93 / 78 / 23
Регистрация: 19.10.2013
Сообщений: 480
11.08.2019, 16:41 20
Цитата Сообщение от ValeryS Посмотреть сообщение
не массив структур, не массив объединений, а именно массив разношерстных данных
Ещё раз!

Цитата Сообщение от WxMaper Посмотреть сообщение
Вы же не будете утверждать, что int list[10]; - массив, а MySuperType list[10]; - не массив?
Цитата Сообщение от ValeryS Посмотреть сообщение
нет не буду
Конечно не будете, вы же сами понимаете, что это нелогично. Нет понятия "массив разношерстных данных". Есть понятие массив.

И я могу положить в массив что угодно и сколько угодно
Можно ли создать массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться int и т.д.?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2019, 16:41

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Получить массив, где будут храниться индексы строк матрицы, в которых есть равные элементы
2. Дан прямоугольный массив A. Получить линейный массив B, в котором будут храниться номера тех...

Создать класс, в котором информация будет храниться в хеше.
А подскажите еще, мне нужно создать класс , в котором в хеше будет храниться информация, ее...

Комментарии. Создать модуль, в котором будет храниться процедура создания картинки
Привет всем! помогите с комментариями к программе пожалуйста... Создайте модуль, в котором будет...

дан массив целых чисел в котором храниться 20 тысяч элементов
дан массив целых чисел в котором храниться 20 тысяч элементов.Найти в массиве первый минимальный...


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

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

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