Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
VIKT0R
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 112
1

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

10.07.2015, 10:34. Просмотров 811. Ответов 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 ошибка!
Только начинаю писать на C++. Помогите пожалуйста разобраться в ламерской...

Про list push_back
list &lt;int&gt; temp; temp.push_back(3); temp.push_back(2); temp.push_back(1); ...

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

Почему push_back() быстрее insert()
Кто-нибудь знает, почему a.push_back(x) в несколько раз быстрее...

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

21
egor2116
572 / 376 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
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
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 112
10.07.2015, 10:55  [ТС] 3
Так-то работает, но это у меня получится список указателей на временные переменные, а я то мечтал создать список массивов.
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 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
159 / 100 / 14
Регистрация: 17.10.2012
Сообщений: 483
Завершенные тесты: 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
572 / 376 / 215
Регистрация: 20.01.2013
Сообщений: 1,135
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
709 / 281 / 16
Регистрация: 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
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 112
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
709 / 281 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 11:33 9
Лучший ответ Сообщение было отмечено VIKT0R как решение

Решение

Цитата Сообщение от VIKT0R Посмотреть сообщение
Я использую в программе typedef double point[3]. Я не знаю, может быть для C++ это не очень хороший стиль?
Да дело даже не в стиле, а в том, что в C++ нельзя массивы передавать по значению.
1
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
10.07.2015, 14:16 10
Цитата Сообщение от VIKT0R Посмотреть сообщение
Спасибо, работает. Только всё же хотелось бы знать, почему без обёртки в структуру не работает, и замедлит ли работу программы добавление этой обёртки?
Нет не замедлит. Не работает потому что в С++ любой массив это указатель. Кстати часто приходится делать такие списки именно структур, так как данные в наборе разнородные.
0
Voivoid
709 / 281 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 14:38 11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
что в С++ любой массив это указатель
Ага, а любой стол - это стул. Ну а что, на стол же тоже можно сесть
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
10.07.2015, 15:45 12
Цитата Сообщение от Voivoid Посмотреть сообщение
Ну а что, на стол же тоже можно сесть
И не только стул но еще и кровать, на него можно еще и лечь.
А любой массив в С++ - это указатель на его начало.
0
Voivoid
709 / 281 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:03 13
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А любой массив в С++ - это указатель на его начало.
Старые песни о главном

Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
http://ideone.com/eWKQUE
1
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
10.07.2015, 16:47 14
Цитата Сообщение от Voivoid Посмотреть сообщение
Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
потому что значение адреса const.
0
Voivoid
709 / 281 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 16:51 15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
потому что значение адреса const.
О, ну тогда что же это? константный указатель присвается неконстантному указателю?

http://ideone.com/eWKQUE
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
10.07.2015, 17:29 16
Цитата Сообщение от Voivoid Посмотреть сообщение
О, ну тогда что же это? константный указатель присвается неконстантному указателю?
Да. Точно так же как значение константы присваивается переменной.
0
Voivoid
709 / 281 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 17:35 17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да. Точно так же как значение константы присваивается переменной.
Кхм, э-э-э, ну ок, допустим. Почему тогда здесь ошибка компиляции-то?

http://ideone.com/eWKQUE
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
10.07.2015, 17:39 18
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
в С++ любой массив это указатель.
Массив - это массив: непрерывный именованный участок памяти, содержащий данные одного типа; имя массива (non-modifiable) lvalue, в некоторых случаях ,может быть раложено (decay) к rvalue: "указателю на первый элемент массива" (что, в частности, происходит в формальных параметрах функций).
Указатель - переменная, содержащая адрес.
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
10.07.2015, 17:45 19
Цитата Сообщение от Voivoid Посмотреть сообщение
Кхм, э-э-э, ну ок, допустим. Почему тогда здесь ошибка компиляции-то?
Просит явно привести тип
0
Voivoid
709 / 281 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2015, 17:54 20
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Просит явно привести тип
Ну так почему же в одном случае ошибка, а в другом - нет?
0
10.07.2015, 17:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 17:54

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

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

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


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

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

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