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

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

Войти
Регистрация
Восстановить пароль
 
 
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 85
#1

Почему не компилируется list.push_back( double[3] ) ? - C++

10.07.2015, 10:34. Просмотров 656. Ответов 21
Метки нет (Все метки)

А почему компилятор отказывается добавлять в список массив?

C++
1
2
3
4
5
6
std::list<double[3]>    lst;   // у компилятора нет замечаний
 
double  arr[3] = { 0 };
 
lst.push_back( arr );   //  а здесь выдает error C2075: Target of operator new():
//для инициализации массива требуются фигурные скобки
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
10.07.2015, 10:41     Почему не компилируется list.push_back( double[3] ) ? #2
Попробуйте как то так
C++
1
2
3
4
5
std::list<double *>    lst;
 
double  arr[3] = { 0 };
 
lst.push_back( arr );
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 85
10.07.2015, 10:55  [ТС]     Почему не компилируется list.push_back( double[3] ) ? #3
Так-то работает, но это у меня получится список указателей на временные переменные, а я то мечтал создать список массивов.
Fulcrum_013
663 / 731 / 72
Регистрация: 14.12.2014
Сообщений: 5,699
Завершенные тесты: 3
10.07.2015, 11:07     Почему не компилируется list.push_back( double[3] ) ? #4
C++
1
2
3
4
5
6
struct a{double arr[3];};
std::list<a>    lst;
 
a  arr = { 0 };
 
lst.push_back( arr );
А вот так должно работать
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
10.07.2015, 11:10     Почему не компилируется list.push_back( double[3] ) ? #5
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <array>
#include <vector>
using namespace std;
 
int main() {    
    vector<array<double, 3>> lst;
    
    array<double, 3> arr {5.0, 6.0, 7.0};
    
    lst.push_back(arr);
    
    cout << lst[0][0] << endl; // 5
    
    return 0;
}
Пример работы
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
10.07.2015, 11:10     Почему не компилируется list.push_back( double[3] ) ? #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
#include <iostream>
#include <list>
 
 
int main(int argc, char** argv) {
    
    const size_t size = 3;
    double * arr1 = new double[size];
    arr1[0] = 1.0;
    arr1[1] = 2.0;
    arr1[2] = 3.0;
    
    double * arr2 = new double[size];
    arr2[0] = 1.0;
    arr2[1] = 2.0;
    arr2[2] = 3.0;
    
    std::list<double *> list;
    
    list.push_back(arr1);
    list.push_back(arr2);
    
    for(std::list<double *>::iterator it = list.begin(); it != list.end(); ++it)
    {
        for(int j = 0; j < size; ++j)
            std::cout << (*it)[j]<< " ";
        std::cout << std::endl;
    }
        
     list.clear();
    delete [] arr1;
    delete [] arr2;
 
    return 0;
}
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 11:13     Почему не компилируется list.push_back( double[3] ) ? #7
Лишняя структурка не нужна, есть же std::array

C++
1
2
3
4
  std::array<double, 3> arr = { 0.0, 0.0, 0.0 };
 
  std::list<std::array<int, 3>> l;
  l.push_back(arr);
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 85
10.07.2015, 11:31  [ТС]     Почему не компилируется list.push_back( double[3] ) ? #8
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
C++
1
2
3
4
struct a{double arr[3];};
std::list<a> lst;
a arr = { 0 };
lst.push_back( arr );
А вот так должно работать
Спасибо, работает. Только всё же хотелось бы знать, почему без обёртки в структуру не работает, и замедлит ли работу программы добавление этой обёртки?

Добавлено через 3 минуты
Цитата Сообщение от egor2116 Посмотреть сообщение
мда
Чего мда? Это и я так могу, спасибо конечно за труд. Просто здесь я не хотел бы связываться с new / delete.

Добавлено через 9 минут
Цитата Сообщение от Voivoid Посмотреть сообщение
Лишняя структурка не нужна, есть же std::array

C++
1
2
3
std::array<double, 3> arr = { 0.0, 0.0, 0.0 };
std::list<std::array<int, 3>> l;
 l.push_back(arr);
Я использую в программе typedef double point[3]. Я не знаю, может быть для C++ это не очень хороший стиль?
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 11:33     Почему не компилируется list.push_back( double[3] ) ? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от VIKT0R Посмотреть сообщение
Я использую в программе typedef double point[3]. Я не знаю, может быть для C++ это не очень хороший стиль?
Да дело даже не в стиле, а в том, что в C++ нельзя массивы передавать по значению.
Fulcrum_013
663 / 731 / 72
Регистрация: 14.12.2014
Сообщений: 5,699
Завершенные тесты: 3
10.07.2015, 14:16     Почему не компилируется list.push_back( double[3] ) ? #10
Цитата Сообщение от VIKT0R Посмотреть сообщение
Спасибо, работает. Только всё же хотелось бы знать, почему без обёртки в структуру не работает, и замедлит ли работу программы добавление этой обёртки?
Нет не замедлит. Не работает потому что в С++ любой массив это указатель. Кстати часто приходится делать такие списки именно структур, так как данные в наборе разнородные.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 14:38     Почему не компилируется list.push_back( double[3] ) ? #11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
что в С++ любой массив это указатель
Ага, а любой стол - это стул. Ну а что, на стол же тоже можно сесть
Fulcrum_013
663 / 731 / 72
Регистрация: 14.12.2014
Сообщений: 5,699
Завершенные тесты: 3
10.07.2015, 15:45     Почему не компилируется list.push_back( double[3] ) ? #12
Цитата Сообщение от Voivoid Посмотреть сообщение
Ну а что, на стол же тоже можно сесть
И не только стул но еще и кровать, на него можно еще и лечь.
А любой массив в С++ - это указатель на его начало.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:03     Почему не компилируется list.push_back( double[3] ) ? #13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А любой массив в С++ - это указатель на его начало.
Старые песни о главном

Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
http://ideone.com/eWKQUE
Fulcrum_013
663 / 731 / 72
Регистрация: 14.12.2014
Сообщений: 5,699
Завершенные тесты: 3
10.07.2015, 16:47     Почему не компилируется list.push_back( double[3] ) ? #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
потому что значение адреса const.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 16:51     Почему не компилируется list.push_back( double[3] ) ?
Еще ссылки по теме:
C++ Не компилируется почему-то
Почему не компилируется C++
C++ почему не компилируется ?
Почему не компилируется? C++
Почему не компилируется код C++

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

Или воспользуйтесь поиском по форуму:
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:51     Почему не компилируется list.push_back( double[3] ) ? #15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
потому что значение адреса const.
О, ну тогда что же это? константный указатель присвается неконстантному указателю?

http://ideone.com/eWKQUE
Yandex
Объявления
10.07.2015, 16:51     Почему не компилируется list.push_back( double[3] ) ?
Ответ Создать тему
Опции темы

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