2014-01-20 4 views
-1

Как объявить 2D вектор со следующими характеристиками:2D вектор с 3-мя колоннами и необъявленной количеством строк

  1. должны иметь 3 колонки (Ofcourse не на самом деле, но все же)

  2. Количество строк необъявленных

Некоторые предполагают, я должен обернуть массив внутри вектора, как показано ниже:

   typedef array <float, 3> Point 
       vector <Point> 2DVector 

Но есть ли способ использовать только вектор для получения желаемого 2D-вектора?

+0

Вектор векторов? Вектор, содержащий 'struct'? Или вы хотите, чтобы вы использовали только один вектор и никаких других структур данных или контейнеров? –

+0

@Joachim. Да вектор вектор. Да, я хочу использовать только вектор. – deepak09027

+0

Итак, используйте вектор векторов (хотя решение массива кажется мне лучше). У вас есть особая проблема с этим? – juanchopanza

ответ

1

Как объявить 2D вектор со следующими характеристиками: [...]

Смесь std::vector и std::array прекрасно подходит для требований:

using table = std::vector<std::array<float, 3>>; 
table 2d_vector; 

Но есть способ использовать только вектор для получения желаемого 2D-вектора?

Здесь:

using table = std::vector<std::vector<float>>; 
table 2d_vector; 

Вы должны быть уверены, что только добавить 3 float с до внутренних векторов, хотя.


Мне нужно вернуть этот вектор в функцию, и компилятор, кажется, не понимают, что такое vector<array<float>>

Ну, да, конечно, это не так. std::vector<std::array<float>> не называет тип.Вы, вероятно, имел в виду:

std::vector<std::array<float, 3>>; 
//       ^^^ 
+0

Я пишу «using namespace std» перед объявлением функции. Должна ли быть проблема? – deepak09027

+0

@ deepak09027, не используйте 'using namespace std'. Просто префикс STL классов/функций/объектов с помощью 'std ::'. – Shoe

1

Использование initializer_list может выглядеть следующим образом;

Первый #include <initializer_list>

std::vector<std::initializer_list<float>> vec{ {1,2,3} }; 
vec.push_back({4,5,6}); // add a row 

Доступ к каждому элементу может быть сделано, как;

for (auto list: vec){ 

    for(auto element: list){ 

     std::cout<< element << " "; // access each element 

    } 

    std::cout<<"\n"; 
} 

Получение индивидуального элемента с (x, y) координатами;

// access first row (y coord = 0), second element (x coord = 1, also the column) 
std::cout<< "vec[0].begin() + 1 = (addr:" << (vec[0].begin() + 1) 
     << " - value: " << *(vec[0].begin() + 1) << ')'; 

Все это вместе выдаст;

1 2 3 
4 5 6 
vec[0].begin() + 1 = (addr:0x40a0d4 - value: 2) 

уборщик способ может быть сделано, как это;

// using a variable type of initializer_list 
std::initializer_list<float> row = {1,2,3}; 
std::vector<std::initializer_list<float>> vec{ row }; 

row = {4,5,6}; // change list 

vec.push_back(row); // add rows 
vec.push_back({7,8,9}); 

for (auto list: vec){ 

    for(auto value: list){ 

     std::cout<< value <<" "; 

    } 

    std::cout<<"\n"; 
} 

//access without looping 
const float *element = vec[0].begin(); 
// pointer to first row, first element (value: 1) 

element+=3; 
// point to second row, first element (value: 4) 

std::cout<<"\nElement("<<*element<<")\n"; 

// access the same element with x,y coords = (0,1) 
int x = 0, y = 1; 
std::cout<<"\ncoord(0,1) = "<< *(vec[y].begin() + x) << "\n"; 

Будет выдавать;

1 2 3 
4 5 6 
7 8 9 

Element(4) 

coord(0,1) = 4 

Проблемы я могу думать с этим (при условии, что это какой-либо ценности) является то, что;

1) данные инициализируются как константа floats, и насколько я знаю, вы не можете их изменить.
и
2) если вы изменили list равным {0,1,2,3,4,5}, теперь у вас будет более 3-х столбцов.

+0

Thanx для ввода. Я не хочу, чтобы данные были инициализированы как постоянные поплавки, а затем ограничение неспособности их изменить. Но это было информативно. Thanx. – deepak09027

+0

Не беспокойтесь, если вам когда-нибудь понадобится постоянный 2d-вектор, вы можете подумать об этом :) – James