使用统一初始化 {} 初始化二维向量
initializing 2d vector using uniform initialization {}
我如何添加功能来初始化这个 2dvector class:-
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
。 class 简而言之,它的功能是扩展许多相同类型的参数。您必须创建新的 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
支撑初始化也称为统一初始化。有关此主题的更多信息,我会向您推荐 Effective Modern C++ - 正是第 7 点。
支撑初始化使用 std::initializer_list
具有强类型(与 auto
相同的情况。这就是为什么使用
的原因
vector<vector<int> > vect{ { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
获得了向量的构造函数
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-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
尝试此代码,因此如果出现任何问题,请报告。
我如何添加功能来初始化这个 2dvector class:-
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
。 class 简而言之,它的功能是扩展许多相同类型的参数。您必须创建新的 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
支撑初始化也称为统一初始化。有关此主题的更多信息,我会向您推荐 Effective Modern C++ - 正是第 7 点。
支撑初始化使用 std::initializer_list
具有强类型(与 auto
相同的情况。这就是为什么使用
vector<vector<int> > vect{ { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
获得了向量的构造函数
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-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
尝试此代码,因此如果出现任何问题,请报告。