簡體   English   中英

使用統一初始化{}初始化2d向量

[英]initializing 2d vector using uniform initialization {}

我如何添加功能來初始化此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;

簡短答案

您應該std::initializer_list 簡而言之,該類的功能是擴展許多相同類型的參數。 您必須創建新的c-tor,並將其包含在參數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 initializer_list進行了強類型std::initializer_list (與auto相同的情況。這是您使用以下原因的原因:

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

您使用std :: initializer_list獲得了vector的構造函數

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

回答

現在,如果我們知道了括號初始化的工作原理,我們就會知道,如果我們有任何帶有std::initializer_list c-tor,那么它將被調用。 示例您如何做到這一點:

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;
    }
};

您應該實現一個構造函數,該構造函數接受初始化列表的初始化列表作為參數:

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 ,因此我想初始化器代表一個列列表。 如果實際上是行列表,則需要轉置:

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嘗試此代碼的uvector ,因此,如果碰巧出現任何問題,請報告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM