0

我如何添加功能来初始化这个 2dvector 类:-

template <typename T>
class uvector2d 
{
public:
uvector2d(size_t xAxis=0, size_t yAxis=0, T const & 
t=T()) : xAxis(xAxis), yAxis(yAxis), data(xAxis*yAxis, t)  
{}

T & operator()(size_t xNum, size_t yNum) 
{return data[xNum*yAxis+yNum];}
T const & operator()(size_t xNum, size_t yNum)    
const      {return data[xNum*yAxis+yNum];}
private:
size_t xAxis,yAxis;
uvector<T> data; 
};

使用统一初始化,如下所示:-

vector<vector<int> > vect{ { 1, 2, 3 }, 
                           { 4, 5, 6 }, 
                           { 7, 8, 9 } }; 

我目前正在使用类似的东西:uvector2dvect(3,3); vect(1,1)=10864;

4

2 回答 2

0

简短的回答

你应该std::initializer_list。简而言之,它的功能是扩展许多相同类型的参数。您必须创建新的 c-tor ,该 c-tor 将包含在 argument 中std::initializer_list

介绍

从 C++11 开始,我们有了新的对象初始化方式:

int x(0);    // old way, rarely used
int y = 0;   // old way, most common
int z{ 0 };  // new way, bracing initialization

支撑初始化也称为统一初始化。有关此主题的更多信息,我将向您推荐有效的现代 C++ - 正是第 7 点。

支撑初始化具有强类型使用std::initializer_list(与使用相同的情况auto。这就是您使用时的原因:

vector<vector<int> > vect{ { 1, 2, 3 }, 
                           { 4, 5, 6 }, 
                           { 7, 8, 9 } };

您使用std::initializer_list获得了向量的构造函数:

vector( std::initializer_list<T> init, 
        const Allocator& alloc = Allocator() );

回答

现在如果我们知道括号初始化是如何工作的,我们就知道如果我们有任何 c-tor ,std::initializer_list那么它将被调用,如果可以的话。示例如何执行此操作:

class ThreeNumbers
{
    int x;
    int y;
    int z;
public:
    ThreeNumbers(std::initializer_list<int> list)
    {
        std::initializer_list<int>::iterator it = list.begin();
        x = *it++;
        y = *it++;
        z = *it;
    }
};
于 2018-11-26T20:36:12.463 回答
0

您应该实现一个构造函数,该构造函数接受初始值设定项列表的初始值设定项列表作为参数:

uvector2d(std::initializer_list<std::initializer_list<T>> list);

在此构造函数中,您只需将列表元素复制到一维data成员向量中。

uvector2d(std::initializer_list<std::initializer_list<T>> list)
    : xAxis(list.size()), yAxis(list.begin()->size()) {
  data.reserve(xAxis * yAxis);
  for (const auto& inner_list : list)
    for (const auto& element : inner_list);
      data.push_back(element);
}

请注意,这仅在内部列表具有相同大小时才有效(这是唯一有意义的情况)。此外,您在 2D 向量中的元素存储似乎是column-major,所以我想初始化程序代表一个列列表。如果它实际上是一个行列表,那么您需要转置:

uvector2d(std::initializer_list<std::initializer_list<T>> list)
    : yAxis(list.size()), xAxis(list.begin()->size()) {
  data.resize(xAxis * yAxis);
  size_t y = 0;
  for (const auto& inner_list : list) {
    size_t x = 0;
    for (const auto& element : inner_list); {
      data[x * yAxis + y] = element;
      x++;
    }
    y++;
  }
}

我无法使用 尝试此代码uvector,因此如果出现任何问题,请报告它们。

于 2018-11-27T07:07:25.677 回答