gpt4 book ai didi

C++ 二维 std::vector 最佳实践

转载 作者:IT老高 更新时间:2023-10-28 23:00:49 26 4
gpt4 key购买 nike

我正在构建一个需要支持二维数组来保存数据网格的应用程序。我有一个包含二维数据网格的类 Map。我想使用 vector 而不是数组,我想知道使用 2d vector 的最佳实践是什么。我应该有一个 MapCells vector 的 vector 吗?还是应该是指向 MapCells 的指针 vector 的 vector ?还是对 MapCells 的引用?

class Map {
private:
vector<vector<MapCell>> cells;

public:
void loadMap() {
cells.clear();
for (int i = 0; i < WIDTH; i++) {
//How should I be allocating these?
vector<MapCell> row(HEIGHT);
for (int j = 0; j < HEIGHT; j++) {
//Should I be dynamically allocating these?
MapCell cell;
row.push_back(cell);
}
cells.push_back(row);
}
}
}

基本上,哪种方式可以让我遇到最少的麻烦(关于内存管理或其他任何事情)?

最佳答案

如果您需要正方形或二维网格,请执行类似于编译器对多维数组(真实数组,不是指向数组的指针数组)所做的操作,并存储一个您正确索引的大数组。

使用下面的 Matrix 类的示例:

struct Map {
private:
Matrix<MapCell> cells;

public:
void loadMap() {
Matrix<MapCell> cells (WIDTH, HEIGHT);

for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
// modify cells[i][j]
}
}

swap(this->cells, cells);
// if there's any problem loading, don't modify this->cells
// Matrix swap guarantees no-throw (because vector swap does)
// which is a common and important aspect of swaps
}
};

矩阵类的变体比比皆是,并且有许多方法可以针对特定用途进行定制。这是一个不到 100 行的示例,可以满足您 80% 或更多的需求:

#include <algorithm>
#include <memory>
#include <vector>

template<class T, class A=std::allocator<T> >
struct Matrix {
typedef T value_type;
typedef std::vector<value_type, A> Container;

Matrix() : _b(0) {}
Matrix(int a, int b, value_type const& initial=value_type())
: _b(0)
{
resize(a, b, initial);
}
Matrix(Matrix const& other)
: _data(other._data), _b(other._b)
{}

Matrix& operator=(Matrix copy) {
swap(*this, copy);
return *this;
}

bool empty() const { return _data.empty(); }
void clear() { _data.clear(); _b = 0; }

int dim_a() const { return _b ? _data.size() / _b : 0; }
int dim_b() const { return _b; }

value_type* operator[](int a) {
return &_data[a * _b];
}
value_type const* operator[](int a) const {
return &_data[a * _b];
}

void resize(int a, int b, value_type const& initial=value_type()) {
if (a == 0) {
b = 0;
}
_data.resize(a * b, initial);
_b = b;
}

friend void swap(Matrix& a, Matrix& b) {
using std::swap;
swap(a._data, b._data);
swap(a._b, b._b);
}

template<class Stream>
friend Stream& operator<<(Stream& s, Matrix const& value) {
s << "<Matrix at " << &value << " dimensions "
<< value.dim_a() << 'x' << value.dim_b();
if (!value.empty()) {
bool first = true;
typedef typename Container::const_iterator Iter;
Iter i = value._data.begin(), end = value._data.end();
while (i != end) {
s << (first ? " [[" : "], [");
first = false;
s << *i;
++i;
for (int b = value._b - 1; b; --b) {
s << ", " << *i;
++i;
}
}
s << "]]";
}
s << '>';
return s;
}

private:
Container _data;
int _b;
};

关于C++ 二维 std::vector 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286991/

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