c ++ Iterative push_back 通过串联?
c++ Iterative push_back via concatenation?
这是我第一次在 Whosebug 上提问,如果我的问题有任何不妥之处,请告诉我。所以我的代码如下:
sf::IntRect WALK_UP0(80, 526, 32, 48);
sf::IntRect WALK_UP1(144, 526, 32, 48);
sf::IntRect WALK_UP2(208, 526, 32, 48);
sf::IntRect WALK_UP3(272, 526, 32, 48);
sf::IntRect WALK_UP4(336, 526, 32, 48);
sf::IntRect WALK_UP5(400, 526, 32, 48);
sf::IntRect WALK_UP6(464, 526, 32, 48);
sf::IntRect WALK_UP7(528, 526, 32, 48);
WALK_UP.push_back(WALK_UP0);
WALK_UP.push_back(WALK_UP1);
WALK_UP.push_back(WALK_UP2);
WALK_UP.push_back(WALK_UP3);
WALK_UP.push_back(WALK_UP4);
WALK_UP.push_back(WALK_UP5);
WALK_UP.push_back(WALK_UP6);
WALK_UP.push_back(WALK_UP7);
我想知道是否有某种方法可以迭代这些 push_back 语句(我假设无法通过迭代完成初始化)。像这样:
for (int i = 0; i < 8; i++)
{
WALK_UP.push_back(WALK_UP + i)
}
如果您试图在 WALK_UP 的末尾复制 WALK_UP 的当前内容,您可以执行以下操作。请注意,由于迭代器失效,某些人可能会想到的方法(例如将 std::copy 与 std::back_inserter 一起使用)可能不安全,具体取决于 WALK_UP 的类型。
for(size_t ndx = 0, count = WALK_UP.size(); count>ndx; ++ndx)
WALK_UP.push_back(&WALK_UP[ndx]);
如果您想避免为向量的每个条目都声明一个变量,您可以通过以下几种方式实现:
使用临时 IntRect 插入元素
WALK_UP.push_back(IntRect{100, 100, 200, 200});
// or if you are lazy, just write
WALK_UP.push_back({100, 100, 200, 200});
这基本相同,因为唯一可能的参数类型是某种 IntRect
(更具体地说 const IntRect&
(左值)或 IntRect&&
(右值),但您通常不需要知道其中的区别)
直接构造向量中的元素
WALK_UP.emplace_back(100, 100, 200, 200);
在这种情况下,emplace_back
的参数被转发到 IntRect 构造函数。
同时插入多个元素
WALK_UP.insert(WALK_UP.end(), {
IntRect{100, 100, 200, 200},
// or again shorter:
{100, 100, 200, 200},
...
{123, 456, 789, 123}
});
使用数组,例如:
sf::IntRect WALK_UPs[8] = {
sf::IntRect(80, 526, 32, 48),
sf::IntRect(144, 526, 32, 48),
sf::IntRect(208, 526, 32, 48),
sf::IntRect(272, 526, 32, 48),
sf::IntRect(336, 526, 32, 48),
sf::IntRect(400, 526, 32, 48),
sf::IntRect(464, 526, 32, 48),
sf::IntRect(528, 526, 32, 48)
};
for (int i = 0; i < 8; ++i) {
WALK_UP.push_back(WALK_UPs[i]);
}
在这种情况下,您 可以 使用迭代器进行初始化,如果这些是唯一被推入容器的元素(我假设您正在使用 std::vector
) :
WALK_UP = std::vector<sf::IntRect>(WALK_UPs, WALK_UPs+8);
或者,如果您仍然需要单个变量(例如,如果它们用于其他目的),您可以使用指针数组:
sf::IntRect WALK_UP0(80, 526, 32, 48);
sf::IntRect WALK_UP1(144, 526, 32, 48);
sf::IntRect WALK_UP2(208, 526, 32, 48);
sf::IntRect WALK_UP3(272, 526, 32, 48);
sf::IntRect WALK_UP4(336, 526, 32, 48);
sf::IntRect WALK_UP5(400, 526, 32, 48);
sf::IntRect WALK_UP6(464, 526, 32, 48);
sf::IntRect WALK_UP7(528, 526, 32, 48);
sf::IntRect* WALK_UPs[8] = {
&WALK_UP0,
&WALK_UP1,
&WALK_UP2,
&WALK_UP3,
&WALK_UP4,
&WALK_UP5,
&WALK_UP6,
&WALK_UP7,
};
for (int i = 0; i < 8; ++i) {
WALK_UP.push_back(*(WALK_UPs[i]));
};
这是我第一次在 Whosebug 上提问,如果我的问题有任何不妥之处,请告诉我。所以我的代码如下:
sf::IntRect WALK_UP0(80, 526, 32, 48);
sf::IntRect WALK_UP1(144, 526, 32, 48);
sf::IntRect WALK_UP2(208, 526, 32, 48);
sf::IntRect WALK_UP3(272, 526, 32, 48);
sf::IntRect WALK_UP4(336, 526, 32, 48);
sf::IntRect WALK_UP5(400, 526, 32, 48);
sf::IntRect WALK_UP6(464, 526, 32, 48);
sf::IntRect WALK_UP7(528, 526, 32, 48);
WALK_UP.push_back(WALK_UP0);
WALK_UP.push_back(WALK_UP1);
WALK_UP.push_back(WALK_UP2);
WALK_UP.push_back(WALK_UP3);
WALK_UP.push_back(WALK_UP4);
WALK_UP.push_back(WALK_UP5);
WALK_UP.push_back(WALK_UP6);
WALK_UP.push_back(WALK_UP7);
我想知道是否有某种方法可以迭代这些 push_back 语句(我假设无法通过迭代完成初始化)。像这样:
for (int i = 0; i < 8; i++)
{
WALK_UP.push_back(WALK_UP + i)
}
如果您试图在 WALK_UP 的末尾复制 WALK_UP 的当前内容,您可以执行以下操作。请注意,由于迭代器失效,某些人可能会想到的方法(例如将 std::copy 与 std::back_inserter 一起使用)可能不安全,具体取决于 WALK_UP 的类型。
for(size_t ndx = 0, count = WALK_UP.size(); count>ndx; ++ndx)
WALK_UP.push_back(&WALK_UP[ndx]);
如果您想避免为向量的每个条目都声明一个变量,您可以通过以下几种方式实现:
使用临时 IntRect 插入元素
WALK_UP.push_back(IntRect{100, 100, 200, 200}); // or if you are lazy, just write WALK_UP.push_back({100, 100, 200, 200});
这基本相同,因为唯一可能的参数类型是某种 IntRect
(更具体地说const IntRect&
(左值)或IntRect&&
(右值),但您通常不需要知道其中的区别)直接构造向量中的元素
WALK_UP.emplace_back(100, 100, 200, 200);
在这种情况下,
emplace_back
的参数被转发到 IntRect 构造函数。同时插入多个元素
WALK_UP.insert(WALK_UP.end(), { IntRect{100, 100, 200, 200}, // or again shorter: {100, 100, 200, 200}, ... {123, 456, 789, 123} });
使用数组,例如:
sf::IntRect WALK_UPs[8] = {
sf::IntRect(80, 526, 32, 48),
sf::IntRect(144, 526, 32, 48),
sf::IntRect(208, 526, 32, 48),
sf::IntRect(272, 526, 32, 48),
sf::IntRect(336, 526, 32, 48),
sf::IntRect(400, 526, 32, 48),
sf::IntRect(464, 526, 32, 48),
sf::IntRect(528, 526, 32, 48)
};
for (int i = 0; i < 8; ++i) {
WALK_UP.push_back(WALK_UPs[i]);
}
在这种情况下,您 可以 使用迭代器进行初始化,如果这些是唯一被推入容器的元素(我假设您正在使用 std::vector
) :
WALK_UP = std::vector<sf::IntRect>(WALK_UPs, WALK_UPs+8);
或者,如果您仍然需要单个变量(例如,如果它们用于其他目的),您可以使用指针数组:
sf::IntRect WALK_UP0(80, 526, 32, 48);
sf::IntRect WALK_UP1(144, 526, 32, 48);
sf::IntRect WALK_UP2(208, 526, 32, 48);
sf::IntRect WALK_UP3(272, 526, 32, 48);
sf::IntRect WALK_UP4(336, 526, 32, 48);
sf::IntRect WALK_UP5(400, 526, 32, 48);
sf::IntRect WALK_UP6(464, 526, 32, 48);
sf::IntRect WALK_UP7(528, 526, 32, 48);
sf::IntRect* WALK_UPs[8] = {
&WALK_UP0,
&WALK_UP1,
&WALK_UP2,
&WALK_UP3,
&WALK_UP4,
&WALK_UP5,
&WALK_UP6,
&WALK_UP7,
};
for (int i = 0; i < 8; ++i) {
WALK_UP.push_back(*(WALK_UPs[i]));
};