gpt4 book ai didi

c++ - (相对)C++ 中大小安全的包装 STL 容器

转载 作者:行者123 更新时间:2023-11-28 03:55:35 24 4
gpt4 key购买 nike

请多多包涵,因为我是自学 C++ 的,并且我在工作上花费了有限的额外时间来尝试更多地了解它(我白天是一名化学工程研究员)。

我有一个非常简单的目标:1. 制作一个大小安全的容器来存储一长串 float 。2. 制作一个充当矩阵的容器的专用版本。

到目前为止,根据对我在这里提出的各种问题的一些反馈,我得出的结论是:

template<typename T>
class VectorDeque
{
public:

void resize_index(unsigned int index) {
if ( my_container == VECTOR ) {
try {
my_vector.resize(index);
my_container = VECTOR;
}
catch(std::bad_alloc &e) {
my_deque.resize(index);
my_container = DEQUE;
}
}
else if ( my_container == DEQUE ) {
my_deque.resize(index);
}
}

T operator[](unsigned int index) {
T ret_val;
if ( STORAGE_CONTAINER == VECTOR ) {
ret_val = my_vector[index];
}
else if ( STORAGE_CONTAINER == DEQUE ) {
ret_val = my_deque[index];
}
}
private:
enum STORAGE_CONTAINER { NONE, DEQUE, VECTOR };

std::vector<T> my_vector;
std::deque<T> my_deque;
STORAGE_CONTAINER my_container;

T& get(int index) {
T temp_val;
if(my_container == VECTOR) {
temp_val = my_vector[index];
}
else if(my_container == DEQUE) {
temp_val = my_deque[index];
}

return temp_val;
}

};

template<typename T>
class VectorDeque2D: public VectorDeque<T>
{
public:

template<typename T>
class VectorDeque2D_Inner_Set
{
VectorDeque2D& parent;
int first_index;
public:
// Just init the temp object
VectorDeque2D_Inner_Set(My2D& p, int first_Index) :
parent(p),
first_Index(first_index) {}
// Here we get the value.
T& operator[](int second_index) const
{ return parent.get(first_index,second_index);}
};

// Return an object that defines its own operator[] that will access the data.
// The temp object is very trivial and just allows access to the data via
// operator[]
VectorDeque2D_Inner_Set<T> operator[](unsigned int first_index) {
return VectorDeque2D_Inner_Set<T>(*this, first_index);
}

void resize_index_second(unsigned int second_index) {
if ( my_container == VECTOR ) {
try {
for (unsigned int couter=0;couter < my_vector.size(); counter++) {
my_vector[counter].resize(second_index);
}
my_container = VECTOR;
}
catch(std::bad_alloc &e) {
for (unsigned int couter=0;couter < my_deque.size(); counter++) {
my_deque[counter].resize(second_index);
}
my_container = DEQUE;
}
}
else if ( my_container == DEQUE ) {
for (unsigned int couter=0;couter < my_deque.size(); counter++) {
my_deque[counter].resize(second_index);
}
}
}

void resize(unsigned int first_index,
unsigned int second_index) {
if ( my_container == VECTOR ) {
try {
my_vector.resize(first_index);
for (unsigned int couter=0;couter < my_vector.size(); counter++) {
my_vector[counter].resize(second_index);
}
my_container = VECTOR;
}
catch(std::bad_alloc &e) {
my_deque.resize(first_index);
for (unsigned int couter=0;couter < my_deque.size(); counter++) {
my_deque[counter].resize(second_index);
}
my_container = DEQUE;
}
}
else if ( my_container == DEQUE ) {
my_deque.resize(first_index);
for (unsigned int couter=0;couter < my_deque.size(); counter++) {
my_deque[counter].resize(second_index);
}
}
}
private:
enum STORAGE_CONTAINER { NONE, DEQUE, VECTOR };

friend class VectorDeque2D_Inner_Set;

std::vector<std::vector<T> > my_vector;
std::deque<std::deque<T> > my_deque;
STORAGE_CONTAINER my_container;

T& get(int first_index,int second_index) {
T temp_val;
if(my_container == VECTOR) {
temp_val = my_vector[first_index][second_index];
}
else if(my_container == DEQUE) {
temp_val = my_deque[first_index][second_index];
}

return temp_val;
}

};

通过这个实现,我尝试:
1. 向包装器的用户提供两个访问选项(“.get(x,y)”和“[x][y]”)
2. 通过拥有一个基础的包装类然后继承它来制作矩阵来最大化重用。
3. 解决在达到连续内存限制的情况下从 vector 转换为双端队列的问题。

这看起来是一个不错的解决方案吗?有什么建议吗?

最佳答案

你看过Boost::Matrix了吗? ?该库中已经构建了很多数值和线性代数的东西。

编辑:

阅读您关于在达到大小限制时从 vector 转换为双端队列的评论后,请使用 deque。像那样变得“花哨”会降低您的工作效率。专注于手头的问题,让收藏为内存操心。 Deque 对于大型数组来说非常快,并且与 vector 相比只有在释放内存时才会受到影响。

关于c++ - (相对)C++ 中大小安全的包装 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com