2013-03-15 3 views
1

C++ У меня есть ArrayListJava ArrayList преобразуется в

ArrayList[][] gridList = new ArrayList[300][150]; 
// Where a and b are some values in the range of the ArrayList. 
ArrayList al = this.gridList[a][b]; 

Как это может быть переведен на C++ ?? Я пробовал использовать std :: vector или std :: map, std :: array. Я просто не могу заставить его работать.

ArrayList al = this.gridList[a][b]; 

Что делает эта линия на самом деле?

Создает ли массив размера?

ArrayList al = new ArrayList[a][b] 

или, возможно, он копирует значения «a» и «b» в новый ArrayList «al»?

Пожалуйста, помогите

+0

Пожалуйста, попытайтесь держать свои сообщения на один вопрос - вы спрашиваете, как перевести 'ArrayList' на C++, или то, что' ArrayList al = this.gridList [a] [b]; 'делает? –

+0

@PhilipKendall OP хочет знать, как перевести двухмерный массив класса Java 'ArrayList' на C++. –

+2

У вас нет списка массивов. У вас есть массив массивов ArrayList. т. е. у вас есть 300 * 150 ссылок на ArrayList (все являются нулевыми). a и b позволяют получить один из этих рефеек, тот, который находится в координатах a, b в матрице ArrayLists. новый ArrayList [a] [b] создает новый массив (длины a) или массивы (длины b) ArrayList. –

ответ

1

Нечто подобное может работать (если вам нужен класс контейнера):

struct Item 
{ ... 
}; 

typedef std::vector<Item> ArrayList; 

// Single row. 
struct ArrayListVector : public std::vector<ArrayList> 
{ 
    ArrayListVector() { resize(150); } 
}; 

// Whole matrix 
struct ArrayListMatrix : public std::vector<ArrayListVector> 
{ 
    ArrayListMatrix() { resize(300); } 
}; 

... 

ArrayListMatrix gridList; //< yes, it is 300 x 150 
ArrayList &a = gridList[a][b]; //< or, you can make a copy 
gridList[b][a] = a; //< assign an entry 

Или вам нужны шаблоны?

Однако есть простой вариант, который не требует шаблонов, классов и т.д.:

ArrayList array[300][150]; //< array is allocated (on stack, or statically). 
+0

Если честно, я не знаю, что мне нужно. Я просто хочу знать, как перевести эти строки кода Java на C++, чтобы я мог переносить код. – user1185305

2

Ваш код не делает то, что вы думаете.

ArrayList[][] gridList = new ArrayList[300][150]; 

Эта первая линия выделяет из arrayarray из ArrayList.

ArrayList al = this.gridList[a][b]; 

Эта вторая линия извлекает ArrayList по смещению b в array по смещению a в array gridList. Вы должны знать, что ваш код не инициализирует ни массивы.

Эквивалентный тип в C++ может быть:

#include <vector> 
#include <array> 

std::array< std::array< std::vector<T>, 150>, 300> gridList; 

, где T является тип элемента, хранящегося в векторах. Обратите внимание, что Java до дженериков разрешает определять ArrayList без указания типа элемента, что в значительной степени соответствует вашему коду. В C++ этот параметр является обязательным. Вышеуказанное определение переменной будет создавать экземпляр для текущей области. вам нужно будет использовать оператор new для динамического значения (как в Java) и, возможно, обернуть его умным указателем.

Для доступа к элементу сетки, вы можете использовать [] оператор:

vector v = gridList[a][b]; 

Учтите, что это вызовет полную копию содержания vector в сетке в положении < а, Ь> в v ,Как было предложено, более эффективным способом было бы написать:

auto const &al = gridList[a][b]; 

Опять же, модель памяти используется Java очень динамична, поэтому если вы хотите код ближе поведения к версии Java, вы, вероятно, что-то вроде :

#include<memory> 

typedef std::vector<int> i_vector; 
typedef std::shared_ptr<i_vector> i_vector_ptr; 
typedef std::array< std::array< i_vector_ptr>, 150>, 300> vector_grid; 

typedef std::shared_ptr<vector_grid> vector_grid_ptr; 

vector_grid_ptr gridList; 

i_vector_ptr al = (*gridList)[a][b]; 

с типом T быть int, и каждый компонент типа сетки четко определенной. Вы все равно должны выделить сетку и каждый элемент (то есть i_vector здесь).

+0

Как вы в своем примере на C++ позже извлекаете массив со смещением a и offset b? это часть, которую я теряю в – user1185305

+1

@ user1185305 'const auto & v = gridList [a] [b]'. Имейте в виду, что здесь вам нужно знать размеры (150 и 300) во время компиляции. В основном вы не можете иметь общий прямой перевод с java на C++. Вы должны четко указать, что хотите. – juanchopanza

+0

Да, я предположил, что размеры постоянны. В противном случае понадобится более классический массив C-style (или вектор). – didierc

1

Если ArrayList держит что-то типа «Foo», то:

std::vector<Foo*> gridList[300][150]; 
std::vector al = this->gridList[a][b]; 
+0

std :: vector al = this-> gridList [a] [b]; Кажется, не компилируется. Какие-либо предложения?? – user1185305

+0

Он компилируется, но я получаю SIGABRT, когда я запускаю. – user1185305

+0

Вам нужно указать тип, который удерживает вектор - я использовал «Foo» в качестве примера. –

Смежные вопросы