Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2017, 14:41   #1
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию Гибкие контейнеры в С++

Всем привет) Ребята, очень нужна ваша помощь. Знаю, что вопрос глупый, но в С++ меня не было уже 7 лет, и я уже основательно попривыкла к такому няшному и удобному ActionScript3.

Собственно, ситуация такая. Мне нужно заполнить два массива. Один - ноликами, другой - массивами объектов. На AS3 выглядит так:

Код:
private var _matrixMyClass : Array;		
private var _matrixInt;

public function Сreate():void 
{                        
        var N:int = 6;
        var M:int = 7;
	_matrixMyClass = new Array();
	_matrixInt = new Array();
	for(var i:int = 0; i < N; i++)
        {
		_matrixMyClass[i] = new Array();	
		_matrixInt[i] = new Array();
		for(var j:int = 0; j < M; j++)
                {
			_matrixMyClass[i][j] = new Array();
			_matrixInt[i][j] = 0;
		}
	}			
}
Замечания:
1) _matrixMyClass [i][j] = new Array();
//в получившийся на месте [i][j] массив я буду в другой функции добавлять объекты типа MyClass (их может быть разное количество - например, в [0][0] один элемент, в [0][1] - три, в [3][2] - ни одного).
2) var N:int = 6; var M:int = 7;
//эти переменные известны только в этой функции, причем при каждом новом вызове create() их значения могут меняться.

Как такое можно реализовать на С++? Я пыталась с помощью std::vector, но запуталась совершенно. C int'овой матрицей, кажется, все норм. Но никак до меня не дойдет, как проинициализировать объектную.

Код:
std::vector<std::vector<MyClass>> _matrixMyClass;
std::vector<std::vector<int>> _matrixInt;

void Create()
{
	int N = 6;
	int M = 7;	

	for (int i = 0; i < N; i++) 
        {
		_matrixMyClass[i].push_back(std::vector<MyClass>());
		_matrixInt.push_back(std::vector<int>());
		for (int j = 0; j < M; j++) 
                {
			_matrixMyClass[i][j] = std::vector<MyClass>();
			_matrixInt[i][j] = 0;
		}
	}
}
Пните, плиз, в какую сторону копать. Из MSDNовского списка контейнеров я так и не нашла подходящий, который может решить мою проблему. Если что, сторонние библиотеки не предлагать - все должно быть на уровне STD/STL.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 02.08.2017, 14:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
_matrixMyClass.push_back(std::vector<MyClass>());
...
_matrixMyClass[i].push_back( MyClass );
P.S. Ну и посмотрите в сторону http://en.cppreference.com/w/cpp/con...r/emplace_back
p51x вне форума Ответить с цитированием
Старый 02.08.2017, 14:53   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию

Так в том-то и дело, что _matrixMyClass[i][j] - это должен быть массив.
А _matrixMyClass[i] - массив массивов.

UPD:
Вот так ругается
Код:
std::vector<std::vector<std::vector<MyClass>>> _matrixMyClass;
...
_matrixMyClass[i].push_back(std::vector<std::vector<MyClass>>());
...
_matrixMyClass[i][j].push_back(std::vector<MyClass>());
Error (active) no instance of overloaded function "std::vector<_Ty, _Alloc>:: push_back [with _Ty=std::vector<MyClass, std::allocator<MyClass>>, _Alloc=std::allocator<std::vector<M yClass, std::allocator<MyClass>>>]" matches the argument list
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 02.08.2017 в 15:02.
ACE Valery вне форума Ответить с цитированием
Старый 02.08.2017, 15:07   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
std::vector<std::vector<std::vector<MyClass>>> _matrixMyClass;
...
_matrixMyClass.push_back(std::vector<std::vector<MyClass>>());
Теперь _matrixMyClass[0] это std::vector<std::vector<MyClass>>. Делает еще push, будет _matrixMyClass[1] - std::vector<std::vector<MyClass>>

Код:
_matrixMyClass[i].push_back(std::vector<std::vector<MyClass>>());
Здесь_matrixMyClass[i] содержит внутри std::vector<MyClass>, а вы пытаетесь ему двойное запихнуть
p51x вне форума Ответить с цитированием
Старый 02.08.2017, 20:40   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
struct MyClass{};

struct example
{
    static const size_t N = 6;
    static const size_t M = 7;

    void Create()
    {
        /*  здесь не нужно ничего делать. 
            оба массивы уже созданны и проинициализированы
        */
    }
    
private:

    int matrixInt[N][M] = {};
    int matrixClass[N][M] = {};
    
};
_Bers вне форума Ответить с цитированием
Старый 02.08.2017, 23:08   #6
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию

Не могу так сделать, n и m вычисляемая величина, которая при вызове функции каждый раз может быть разная.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 13.08.2017, 15:34   #7
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию

Всем спасибо, решилось вот так. До сих пор не пойму, как могла так затупить

Код:
std::vector<std::vector<std::vector<MyClass>>> _matrixMyClass;
std::vector<std::vector<int>> _matrixInt;

void Create()
{
	int N = 6;
	int M = 7;

	for (int i = 0; i < N; i++) {
		_matrixMyClass.push_back(std::vector<std::vector<MyClass>>());
		_matrixInt.push_back(std::vector<int>());
		for (int j = 0; j < M; j++) {
			_matrixMyClass[i].push_back(std::vector<MyClass>());
			_matrixInt[i].push_back(0);
		}
	}
}
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
си++ контейнеры BMPbmp Общие вопросы C/C++ 4 03.06.2016 13:50
Контейнеры Pixelrom33 Общие вопросы .NET 2 17.01.2015 17:27
TSR-программа по горячей клавише блокирует гибкие диски. При повторномдеблокирует vasili Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.05.2010 11:48
блокировать гибкие диски Ёрик Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 08.06.2009 21:30
Контейнеры Crucian Общие вопросы C/C++ 1 22.09.2007 22:02