我想用8对填充矢量。每一对代表棋子中的骑士在x和y坐标中的移动。目前我正在这样做
vector<pair<int,int>> moves;
pair<int,int> aPair;
aPair.first = -2;
aPair.second = -1;
moves.push_back(aPair);
aPair.first = -2;
aPair.second = 1;
moves.push_back(aPair);
aPair.first = -1;
aPair.second = -2;
moves.push_back(aPair);
aPair.first = -1;
aPair.second = 2;
moves.push_back(aPair);
aPair.first = 1;
aPair.second = -2;
moves.push_back(aPair);
aPair.first = 1;
aPair.second = 2;
moves.push_back(aPair);
aPair.first = 2;
aPair.second = -1;
moves[6].push_back(aPair);
aPair.first = 2;
aPair.second = 1;
moves.push_back(aPair);
我这样做是为了了解Std库。这似乎是解决这个问题的一种无望的低效方式。
任何人都有更优雅的解决方案?
答案 0 :(得分:16)
如果你有C ++ 11(否则你不能写>>
),你可以使用以下内容:
vector<pair<int,int>> moves = {
{-2, -1},
{-2, 1},
{-1, -2},
{-1, 2},
{ 1, -2},
{ 1, 2},
{ 2, -1},
{ 2, 1}
};
答案 1 :(得分:13)
循环救援:
for(int k = 0; k < 2; k++)
for(int i = -1; i < 2; i += 2)
for(int j = -1; j < 2; j+= 2)
result.push_back(make_pair(i * (k+1), j * (((k + 1) % 2) + 1)));
答案 2 :(得分:9)
在C ++ 98/03中:
moves.push_back(std::make_pair(-2, -1));
在C ++ 11中:
moves.emplace_back(-2, -1);
或者在C ++ 11中:
std::vector<std::pair<int, int>> moves = { { -2, -1}, ... };
答案 3 :(得分:6)
如果您没有C ++ 11,则可以使用make_pair,为向量预分配空间,而无需使用reserve初始化元素,然后在不进行新分配的情况下使用push_back。
例如:
vector<pair<int,int> > moves;
moves.reserve(8);
moves.push_back(make_pair(-2, -1));
// and so on
即使您拥有C ++ 11,如果您需要动态计算元素而不是硬编码,这种技术也很有用。
答案 4 :(得分:3)
试试:
vector<pair<int,int>> moves{{-2, -1}, {2, 1}, {-1, -2}, {-1, 2},
{1, -2}, {1, 2}, {2, -1}, {2, 1}};
Initializer list和Uniform Initialization一起在C ++ 11中提供了很多功能。
答案 5 :(得分:1)
这是另一种做同样事情的方法。
template <class VectorClass>
class CreateVector
{
public:
typedef typename VectorClass::value_type value_type;
CreateVector(const value_type& value)
{
mVector.push_back(value);
}
CreateVector& operator()(const value_type& value)
{
mVector.push_back(value);
return *this;
}
inline operator VectorClass() const
{
return mVector;
}
private:
VectorClass mVector;
};
用法:
vector<pair<int,int>> moves = CreateVector<vector<pair<int,int> > >
(make_pair(1,2))
(make_pair(2,3))
(make_pair(3,4))
(make_pair(4,5));
编辑:如果您没有使用C ++ 11,这将是一种方式。否则,我建议采用@ipc建议的方式。
答案 6 :(得分:0)
如果您使用的是C ++ 11,您可能需要考虑使用std :: array而不是std :: vector。与普通数组一样,std数组具有固定数量的元素,如果事先知道您使用了多少数据,则更具概念意义。
答案 7 :(得分:0)
希望是一个更具可读性的循环版本:
vector<pair<int, int>> result;
for(int moveX=1; moveX<=2; moveX++)
{
for(int signX=-1; signX<=1; signX+=2)
{
for(int signY=-1; signY<=1; signY+=2)
{
result.push_back(make_pair(moveX*signX, (3-moveX)*signY));
}
}
}
Full program生成以下向量:
{-1, -2},
{-1, 2},
{1, -2},
{1, 2},
{-2, -1},
{-2, 1},
{2, -1},
{2, 1},
答案 8 :(得分:-1)
> vector<pair<int,int>>x; pair<int,int>y;
>
> for(int i=0;i<3;i++){
> cin>>y.first;
> cin>>y.second;
> x.push_back(y); } for(int i=0;i<3;i++){
> cout<<x[i].first<<" "<<x[i].second<<endl; }
这是我们应添加cin语句的方式。