2D вектор с 3 столбцами и необъявленным количеством строк

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

  1. Должно иметь 3 столбца (Конечно, нет, но все же)

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

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

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

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

-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>>;
//                          ^^^
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 столбцов.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector