Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
1

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

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

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

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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2015, 10:34
Ответы с готовыми решениями:

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

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

Потокобезопасность при одновременном pop_front и push_back std::list
Есть std::list. Поток &quot;потребитель&quot;, если size() &gt; 1 забирает front() и делает pop_front(). Поток...

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

21
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
10.07.2015, 10:55  [ТС] 3
Так-то работает, но это у меня получится список указателей на временные переменные, а я то мечтал создать список массивов.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
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
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
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
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
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
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
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
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
10.07.2015, 11:33 9
Лучший ответ Сообщение было отмечено VIKT0R как решение

Решение

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

Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
http://ideone.com/eWKQUE
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
10.07.2015, 16:47 14
Цитата Сообщение от Voivoid Посмотреть сообщение
Если массив это указатель, то почему операции, которые работают с указателями не работают с массивами?
потому что значение адреса const.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
10.07.2015, 16:51 15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
потому что значение адреса const.
О, ну тогда что же это? константный указатель присвается неконстантному указателю?

http://ideone.com/eWKQUE
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
10.07.2015, 17:29 16
Цитата Сообщение от Voivoid Посмотреть сообщение
О, ну тогда что же это? константный указатель присвается неконстантному указателю?
Да. Точно так же как значение константы присваивается переменной.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
10.07.2015, 17:35 17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да. Точно так же как значение константы присваивается переменной.
Кхм, э-э-э, ну ок, допустим. Почему тогда здесь ошибка компиляции-то?

http://ideone.com/eWKQUE
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
10.07.2015, 17:39 18
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
в С++ любой массив это указатель.
Массив - это массив: непрерывный именованный участок памяти, содержащий данные одного типа; имя массива (non-modifiable) lvalue, в некоторых случаях ,может быть раложено (decay) к rvalue: "указателю на первый элемент массива" (что, в частности, происходит в формальных параметрах функций).
Указатель - переменная, содержащая адрес.
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
10.07.2015, 17:45 19
Цитата Сообщение от Voivoid Посмотреть сообщение
Кхм, э-э-э, ну ок, допустим. Почему тогда здесь ошибка компиляции-то?
Просит явно привести тип
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
10.07.2015, 17:54 20
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Просит явно привести тип
Ну так почему же в одном случае ошибка, а в другом - нет?
0
10.07.2015, 17:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2015, 17:54
Помогаю со студенческими работами здесь

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

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из ...

Как узнать размерность внутреннего вектора в массиве List<List<Double>>?
Добрый вечер! Уважаемые, подскажите пожалуйста, как узнать размерность внутренних строк в...

Перевод List<List<double>> в double[][]
Есть ли короткая запись перевода List&lt;List&lt;double&gt;&gt; в double? Я имею в виду перевод без цикла,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru