2013-08-15 3 views
3

Я ищу способ создать вектор C++, который будет содержать объект класса (который является многомерным массивом - координатором местоположения 3D-координат) и int-объектом, который каким-то образом описывает его.Как создать многомерный многопоточный вектор C++?

Я нашел много примеров многомерных векторов однотипных как

vector <vector<int>> vec (4, vector<int>(4)); 

мне нужна динамическая структура, которая может расти/уменьшаться в куче, как прогресс времени с гибкостью векторного типа.

+0

Ну, это * есть * a [std :: vector <>] (http://en.cppreference.com/w/cpp/container/vector). Итак, какой рост (или сокращение), по вашему мнению, он не может сделать? (и +1 для НЕ использования 'new' в этом заданном тривиальном фрагменте). – WhozCraig

+0

Либо используйте 'boost :: variant',' std :: pair', либо определенную пользователем структуру. Не могли бы вы сделать вопрос более конкретным с примером кода или чем-нибудь еще, чтобы вы могли сказать нам _exactly_, чего вы стремитесь достичь? –

+0

Если все ваши объекты получены из общего базового класса, вы можете использовать 'std :: vector >>'. –

ответ

1
// Your position object, whatever the declaration may be 
struct Position { int x, y, z; }; 

struct Connection { 
    Position position; 
    int strength; 
}; 

// This is what you want your node class to be 
// based on the comment you gave. 
struct Node { 
    Position position; 
    std::vector<Connection> connections; 
}; 

// A vector is dynamic and resizable. 
// Use std::vector::push_back and std::vector::emplace_back methods 
// insert elements at the end, and use the resize method to modify 
// the current size and capacity of the vector. 
std::vector<std::vector<std::vector<Node>>> matrix; 

В качестве альтернативы можно определить Connection как std::pair<Position, int>, но это будет не очень хорошо, потому что если вы хотел бы добавить дополнительную информацию в Connection в будущем, вам придется изменить больше кода, чем нужно.

Если вы хотите изменить размер всего многомерного массива, вам придется перебирать по всем векторам один за другим с помощью цикла и вызывать метод resize.

+0

выглядит как элегантное решение, но мне все равно хотелось бы избежать «структуры» и использовать класс. Я дам ему попробовать ... TnX .. Если у кого-то еще есть какая-либо другая (или лучшая) реализация, мне бы очень хотелось услышать об этом ... – DarthRa

+0

template Class Node {private T1 X; T2Y; T3Z; Сила Т4; // etc etc и после этого сделать вектор? – DarthRa

+0

Нет никакой разницы между структурами и классами, отличными от того факта, что члены в структурах являются общедоступными по умолчанию, а члены классов по умолчанию являются закрытыми. Кроме того, да, это должно работать нормально. –

0

Вы можете получить только «гибкость типа» из std::vector, чтобы он сохранил полиморфный тип. Основываясь на вашем примере, это выглядит, как вы можете захотеть std::vector из struct S:

struct s 
{ 
    int i; 
    double d; 
    char c; 
    bool b; 
}; 

std::vector<s> vec; 

// elements can be accessed as such: 
auto i = vec[0].i; 
auto d = vec[0].d; 
auto c = vec[0].c; 
auto b = vec[0].b; 
+0

как насчет [code] vector <вектор > vec (2, вектор (4)); – DarthRa

+0

Нет, 'vector' содержит один тип элемента. Вы пытаетесь объявить 'vector'' vector' 'class' и пытаетесь инициализировать его двумя элементами типа' vector' 'int'. Глядя на ваш комментарий к вопросу, вам понадобится нечто большее, чем «вектор» структур. Я вернусь к этому, как только я заставлю ребенка спать. Если он все еще открыт. –

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