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

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

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

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

10.07.2015, 10:34. Просмотров 670. Ответов 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():
//для инициализации массива требуются фигурные скобки
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2015, 10:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не компилируется list.push_back( double[3] ) ? (C++):

list.push_back ошибка! - C++
Только начинаю писать на C++. Помогите пожалуйста разобраться в ламерской ошибке! В классе инициализирую list&lt;CProgressCtrl&gt;. Затем в...

Про list push_back - C++
list &lt;int&gt; temp; temp.push_back(3); temp.push_back(2); temp.push_back(1); list &lt;int&gt;::iterator iter = temp.begin(); for(int...

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

Почему возможно задать массив с размером -1 (почему такое вообще компилируется)? - C++
Всем привет. Долгое время не писал на плюсах, решил пройтись по основам, вспомнить. По непонятным для меня причинам этот код...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
10.07.2015, 10:41 #2
Попробуйте как то так
C++
1
2
3
4
5
std::list<double *>    lst;
 
double  arr[3] = { 0 };
 
lst.push_back( arr );
1
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 85
10.07.2015, 10:55  [ТС] #3
Так-то работает, но это у меня получится список указателей на временные переменные, а я то мечтал создать список массивов.
0
Fulcrum_013
721 / 746 / 73
Регистрация: 14.12.2014
Сообщений: 5,904
Завершенные тесты: 3
10.07.2015, 11:07 #4
C++
1
2
3
4
5
6
struct a{double arr[3];};
std::list<a>    lst;
 
a  arr = { 0 };
 
lst.push_back( arr );
А вот так должно работать
1
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
10.07.2015, 11:10 #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;
}
Пример работы
0
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
10.07.2015, 11:10 #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;
}
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 11:13 #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);
1
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 85
10.07.2015, 11:31  [ТС] #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++ это не очень хороший стиль?
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 11:33 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от VIKT0R Посмотреть сообщение
Я использую в программе typedef double point[3]. Я не знаю, может быть для C++ это не очень хороший стиль?
Да дело даже не в стиле, а в том, что в C++ нельзя массивы передавать по значению.
1
Fulcrum_013
721 / 746 / 73
Регистрация: 14.12.2014
Сообщений: 5,904
Завершенные тесты: 3
10.07.2015, 14:16 #10
Цитата Сообщение от VIKT0R Посмотреть сообщение
Спасибо, работает. Только всё же хотелось бы знать, почему без обёртки в структуру не работает, и замедлит ли работу программы добавление этой обёртки?
Нет не замедлит. Не работает потому что в С++ любой массив это указатель. Кстати часто приходится делать такие списки именно структур, так как данные в наборе разнородные.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 14:38 #11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
что в С++ любой массив это указатель
Ага, а любой стол - это стул. Ну а что, на стол же тоже можно сесть
0
Fulcrum_013
721 / 746 / 73
Регистрация: 14.12.2014
Сообщений: 5,904
Завершенные тесты: 3
10.07.2015, 15:45 #12
Цитата Сообщение от Voivoid Посмотреть сообщение
Ну а что, на стол же тоже можно сесть
И не только стул но еще и кровать, на него можно еще и лечь.
А любой массив в С++ - это указатель на его начало.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:03 #13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А любой массив в С++ - это указатель на его начало.
Старые песни о главном

Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
http://ideone.com/eWKQUE
1
Fulcrum_013
721 / 746 / 73
Регистрация: 14.12.2014
Сообщений: 5,904
Завершенные тесты: 3
10.07.2015, 16:47 #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
потому что значение адреса const.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:51 #15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
потому что значение адреса const.
О, ну тогда что же это? константный указатель присвается неконстантному указателю?

http://ideone.com/eWKQUE
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 16:51
Привет! Вот еще темы с ответами:

Template double linked list C++ - C++
Пытался реализовать шаблон класса двусвязный список, элементарами которого является класс структура. 1. Как теперь инициализировать класс...

Не компилируется почему-то - C++
Вот код программы, она вроде как бы работает, но все равно выдаются ошибки, помогите пожалуйста их исправить, в c++ я новичок: ...

Почему не компилируется? - C++
Привет, перейду сразу к делу. Вот все говорят, что Visual Studio самая крутая студия, а она даже не может скомпилировать эту простую...

Почему не компилируется - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; const double Pi = 3.14159; double Area(double...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2015, 16:51
Ответ Создать тему
Опции темы

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