我正在嘗試制作一個可以動態分配二維結構的通用函式。每行中的元素數不必對所有行都相同。結構表示為容器型別,其元素又是容器型別(例如一組串列)。該內部容器的元素型別也可以是任意的。容器僅支持 begin、end 和 size 函式。所有迭代器型別都必須支持迭代器操作。該函式應首先通過連續分配程序動態分配存盤二維結構的空間,然后將其接受的結構的元素重寫為動態結構。該函式回傳一個雙指標,通過它可以訪問此結構的元素。
#include <iostream>
#include <set>
#include <list>
#include <vector>
template < typename tip >
auto Make2DStructure(tip mat) {
using tip_objekta = typename std::decay < decltype(mat[0][0]) > ::type;
tip_objekta ** dynamic_mat = nullptr;
int rows = 0, total = 0;
for (auto i: mat) {
rows ;
for (auto j: i)
total ;
}
int columns[rows];
int k = 0;
for (auto i: mat) {
int num_of_colums = 0;
for (auto j: i)
num_of_colums ;
columns[k] = num_of_colums;
k ;
}
try {
dynamic_mat = new tip_objekta * [rows];
dynamic_mat[0] = new tip_objekta[total];
for (int i = 1; i < rows; i )
dynamic_mat[i] = dynamic_mat[i - 1] columns[i];
for (int i = 0; i < rows; i )
for (int j = 0; j < columns[i]; j )
dynamic_mat[i][j] = mat[i][j];
} catch (...) {
delete[] dynamic_mat[0];
delete[] dynamic_mat;
throw std::bad_alloc();
}
return dynamic_mat;
}
int main() {
std::vector<std::vector<int>>mat{
{1,2},
{3,4,5,6},
{7,8,9}
};
int columns[3]={2,4,3};
try {
int ** dynamic_mat = Make2DStructure(mat);
for (int i = 0; i < 3; i ) {
for (int j = 0; j < columns[i]; j )
std::cout << dynamic_mat[i][j] << " ";
std::cout << std::endl;
}
delete[] dynamic_mat[0];
delete[] dynamic_mat;
} catch (...) {
std::cout << "Problems with memory";
}
return 0;
}
我如何修改它以使其在沒有索引的情況下作業Make2DStrucure()
?
另外,如果我在 main 函式中使用std::set<std::list<int>>
而不是,std::vector<std::vector<int>>
我會遇到推論問題。我如何修改它以適用于不同的外部和內部容器?
uj5u.com熱心網友回復:
這是實作您想要的一種方法:
#include <iterator>
#include <type_traits>
template <typename tip>
auto Make2DStructure(tip&& mat) {
// create an alias for the value type:
using value_type = std::decay_t<decltype(*std::begin(*std::begin(mat)))>;
// allocate memory for the return value, the pointer-pointer:
value_type** rv = new value_type*[mat.size()]; // C 17: std::size(mat)
// Calculate the number of values we need to allocate space for:
size_t values = 0;
for(auto& inner: mat) values = inner.size(); // C 17: std::size(inner)
// allocate the space for the values:
value_type* data = new value_type[values];
// loop over the outer and inner container and keep the index running:
size_t idx = 0;
for(auto& inner : mat) {
// assign the outer pointer into the flat data block:
rv[idx ] = data;
for(auto& val : inner) {
// assign values in the data block:
*data = val;
}
}
return rv;
}
通過使用std::size
where 指示,這也適用于普通陣列,而不僅僅是容器類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470402.html