gpt4 book ai didi

C++容器问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:31 25 4
gpt4 key购买 nike

我正在寻找一些合适的 2D 元素容器。我想要的是使用例如 BOOST_FOREACH 遍历容器的每个元素的能力,我还希望能够构建我的容器的 subview (切片/子范围),并且可能迭代也通过他们。

现在我正在使用 boost::numeric::ublas::matrix 来实现这些目的,但是,它对我来说并不是一个好的解决方案,因为,它是一个 BLAS 矩阵,尽管它作为一个普通的 2d 元素容器表现得非常好(自定义 unbounded/bounded 存储也很不错)。

另一种 boost 替代方法 boost::multi_array 不好,因为您无法使用一个 BOOST_FOREACH 遍历每个元素声明,因为构造 View 的语法极其困惑。

还有其他选择吗?

谢谢。

最佳答案

我执行以下操作(数组类型是容器/迭代器范围概念):

ublas::matrix<douple> A;
foreach (double & element, A.data())
{
}

但是,这不适用于切片:最好的解决方案是为它们编写一个迭代器。

下面是一个使用multi_array 来提供自定义类存储的例子。或许您也可以这样做:

template<size_t N, typename T>
struct tensor_array : boost::multi_array_ref<T,N> {
typedef boost::multi_array_ref<T,N> base_type;

typedef T value_type;
typedef T& reference;
typedef const T& const_reference;

tensor_array() : base_type(NULL, extents())
{
// std::cout << "create" << std::endl;
}
template<class A>
tensor_array(const A &dims)
: base_type(NULL, extents())
{
//std::cout << "create" << std::endl;
resize(dims);
}

template<typename U>
void resize(const U (&dims)[N]) {
boost::array<U,N> dims_;
std::copy(dims, dims + N, dims_.begin());
resize(dims_);
}

template<typename U>
void resize(const boost::array<U,N> &dims) {
size_t size = 1;
boost::array<size_t,N> shape;
for (size_t i = 0; i < N; ++i) {
size *= dims[i];
shape[N-(i+1)] = dims[i];
}
data_.clear();
data_.resize(size, 0);
// update base_type parent
set_base_ptr(&data_[0]);
this->num_elements_ = size;
reshape(shape);
}

size_t size() const { return data_.size(); }
size_t size(size_t i) const { return this->shape()[N-(i+1)]; }
tensor_array& fill(const T &value) {
std::fill(data_.begin(), data_.end(), value);
return *this;
}
private:
typedef boost::detail::multi_array::extent_gen<N> extents;
std::vector<T> data_;
};

关于C++容器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266493/

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