Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
21 / 21 / 19
Регистрация: 18.03.2014
Сообщений: 148
1

Как объявить и инициализировать двумерный массив

22.05.2015, 20:46. Показов 3199. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане!

Недавно решил постичь ДЗЕН STL-контейнеров C++ и начал с векторов. С одномерными векторами вроде кое-как разобрался, но с двумерными появились траблы. На одном из сайтов видел вот такое объявление:
C++
1
2
3
std::vector<int> vec {{1,2,3,4},
                      {2,3,4,5},
                      {5,6,7,8}};
Но при попытке скомпилировать пустой проект с таким объявлением вектора появляется Improper use of typedef 'vector<int,allocator<int> >' и Statement missing ;. Появляется подозрение, что меня немножко обманули. Хотя по комментариям на том сайте я бы не сказал, что там написано что-то не верно.
Видел такое объявление:
C++
1
std::vector< std::vector<int> > m_vector
Оно то компилируется, но хотелось бы с первым вариантом разобраться. Душе мил такой способ задания, как это было со старыми добрыми сишными массивами.

Собственно, как разрулить то это дело?

Заранее спасибо

Добавлено через 9 минут
П.С. прошу прощения за отсутствие компетенции по этому вопросу. только начал грызть этот гранит
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2015, 20:46
Ответы с готовыми решениями:

Как объявить указатель на массив через typedef и как инициализировать такой тип
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа...

Как инициализировать двумерный массив?
подскажите как инициализировать двумерный массив long long int mass;

Как инициализировать значениями динамический двумерный массив ?
Есть функция: static int ** MatrixMultiplication(int ** A, int ** B, int size = 4); Также есть...

Как объявить двумерный динамический массив
int *matrix = new int ; че ругается ? а как сделать если без констант надо ?

17
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
22.05.2015, 21:05 2
Цитата Сообщение от bogdan_017 Посмотреть сообщение
Оно то компилируется, но хотелось бы с первым вариантом разобраться
Фигурные скобки могут быть использованы в двух случаях: 1. инициализация сишного статического массива; 2. декларация (довольно условный термин) лексической области видимости.
Для инициализации объектов используются круглые скобки. Линк на источник, если можно.
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
22.05.2015, 21:08 3
Лучший ответ Сообщение было отмечено bogdan_017 как решение

Решение

это инфа про старый стандарт. в новом можно в фигурных.
в коде примера ошибка в типе. там вектор, а не вектор векторов.
правильно:
C++
1
2
3
4
5
6
7
#include <vector>
 
int main()
{
    std::vector<std::vector<int>> v = {{1,2},{3,4}};
    return 0;
}
компилябельность зависит от поддержки этой фичи компилятором.
вот тут компилятор умеет жрать такую инициализацию: http://cpp.sh/7j56
2
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
22.05.2015, 21:16 4
Perfilov, как бы operator= не конструктор. Значит это не инициализация. Я так рассуждаю. ???
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
22.05.2015, 21:17 5
не совсем. в случае объявления переменной вызывается конструктор не смотря на то, что там = стоит.
0
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
22.05.2015, 21:38 6
хотелось бы пруфлинк, я раньше cplusplus dot com пользовался, но вижу что он уже не актуален.
0
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
22.05.2015, 21:42 7
Исходя из собственного мизерного опыта 3 дня начала изучения питона(так отвлечся чет хотелось) помогли понять саму религию STL как самые популярные веши устроенны...но не с кажу что до этого не знал теорию
0
18900 / 9858 / 2410
Регистрация: 30.01.2014
Сообщений: 17,301
22.05.2015, 21:43 8
Цитата Сообщение от cybercitizen Посмотреть сообщение
хотелось бы пруфлинк, я раньше cplusplus dot com пользовался, но вижу что он уже не актуален.
Пользоваться надо этим.
12.6.1/1
An object of class type can be initialized with a parenthesized expression-list, where the expression-list
is construed as an argument list for a constructor that is called to initialize the object. Alternatively, a
single assignment-expression can be specified as an initializer using the = form of initialization
. Either
direct-initialization semantics or copy-initialization semantics apply; see 8.5. [ Example:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct complex {
    complex();
    complex(double);
    complex(double,double);
};
complex sqrt(complex,complex);
complex a(1); // initialize by a call of complex(double)
complex b = a; // initialize by a copy of a
complex c = complex(1,2); // construct complex(1,2) using complex(double,double) copy/move it into c
complex d = sqrt(b,c); // call sqrt(complex,complex) and copy/move the result into d
complex e; // initialize by a call of complex()
complex f = 3; // construct complex(3) using complex(double) copy/move it into f
complex g = { 1, 2 }; // initialize by a call of complex(double, double)
— end example ] [ Note: overloading of the assignment operator (13.5.3) has no effect on initialization. — end
note ]
1
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
22.05.2015, 21:45 9
C++
1
2
    // c++11 initializer list syntax:
    std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"};
так что
Цитата Сообщение от Perfilov Посмотреть сообщение
в коде примера ошибка в типе
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Пользоваться надо этим.
Спасибо, капитан. :)

0
DrOffset
22.05.2015, 21:48
  #10

Не по теме:

Цитата Сообщение от cybercitizen Посмотреть сообщение
Спасибо, капитан.
Ты просил пруфы? Просил. Ты получил пруфы? Получил.
Тогда почему я капитан?

0
21 / 21 / 19
Регистрация: 18.03.2014
Сообщений: 148
22.05.2015, 22:04  [ТС] 11
cybercitizen, вы просили линк на источник. http://cppstudio.com/post/8670/, только там string, а не int. Хотя в принципе не существенно.

Добавлено через 10 минут
Так тоже ругается.
Цитата Сообщение от cybercitizen Посмотреть сообщение
// c++11 initializer list syntax:
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"};
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
22.05.2015, 22:07 12
bogdan_017, какой у вас компилятор?
0
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
22.05.2015, 22:15 13

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Тогда почему я капитан?
Потому что "Никогда ты не станешь майором!" (c). За пруф спасибо.


Цитата Сообщение от bogdan_017 Посмотреть сообщение
Так тоже ругается
надо указать ключик стандарта http://ideone.com/HUD2Oz
0
21 / 21 / 19
Регистрация: 18.03.2014
Сообщений: 148
22.05.2015, 22:17  [ТС] 14
cybercitizen, S_el, я вот об этом тоже задумался минут 10 назад. Я тренировался на билдере 6-ом. Попробовал запустить на VS 2013 Ultimate. Стало компилироваться это:
C++
1
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"};
и это (из источника, линк выше):
C++
1
2
3
vector<string>vecStr1{{'a','b','c','d'},
                      {'e','f','g','h'},
                      {'i','j','k','l'}};
Но вариант с int все равно не работает.
C++
1
2
3
std::vector<int> vec {{1,2,3,4},
                      {2,3,4,5},
                      {5,6,7,8}};
0
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
22.05.2015, 22:20 15
Цитата Сообщение от bogdan_017 Посмотреть сообщение
Но вариант с int все равно не работает
тебе уже говорили что тип неправильно указан. http://ideone.com/g6ikLG
0
18900 / 9858 / 2410
Регистрация: 30.01.2014
Сообщений: 17,301
22.05.2015, 22:20 16
Цитата Сообщение от bogdan_017 Посмотреть сообщение
Но вариант с int все равно не работает.
Он не должен работать.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
22.05.2015, 22:25 17
Цитата Сообщение от bogdan_017 Посмотреть сообщение
с int все равно не работает.
Вам уже сказали, что нужно вектор из векторов. Для string работает. потому что там используются char-массивы, которыми инициализируются string'и.
1
21 / 21 / 19
Регистрация: 18.03.2014
Сообщений: 148
22.05.2015, 22:35  [ТС] 18
cybercitizen, хм.. если я правильно понял, в случае со строками, мы используем одномерный вектор и храним тип string, а он по сути уже и является одномерным массивом. Таким образом получаем двумерный символьный массив (условно).
А в случае с int получается то же, что и в обычном динамическом массиве (сначала создаем массив указателей, а затем в каждый указатель инициализируем, как указатель на одномерный массив)

Добавлено через 4 минуты
Kerry_Jr, спасибо, я, кажется уже разобрался и немного прослоупочил со своим сообщением)
0
22.05.2015, 22:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2015, 22:35
Помогаю со студенческими работами здесь

Как объявить многомерный массив и сразу инициализировать его?
Методом проб выяснил, что объявить и сразу проинициализировать многомерный массив можно так (пример...

Как инициализировать двумерный массив с клавиатуры?
Задача такая: дана целочисленная матрица MxN. Необходимо обеспечить пользователю ввод количества...

Объявить массив, но не инициализировать его
Здравствуйте. Умею кодить на яве, сейчас учусь на паскале и меня интересует вопрос: Можно ли...

Как инициализировать двумерный массив с ASCII файла ?
Есть файл вида: ... 132 132 133 132 131 131 131 131 130 129 128 130 130 131 132 133 133 132...


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

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