15

ベクトルを 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ライブラリについて学ぶためにこれをやっています。これは、この問題を解決するための絶望的に非効率的な方法のようです。

誰もがよりエレガントなソリューションを持っていますか?

4

9 に答える 9

16

C++11 を使用している場合 (それ以外の場合は を記述できません>>)、次を使用できます。

vector<pair<int,int>> moves = {
  {-2, -1},
  {-2,  1},
  {-1, -2},
  {-1,  2},
  { 1, -2},
  { 1,  2},
  { 2, -1},
  { 2,  1}
};
于 2012-11-15T21:52:43.277 に答える
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)));

出力: http: //ideone.com/2B0F9b

于 2012-11-15T23:08:35.303 に答える
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}, ... };
于 2012-11-15T21:58:48.937 に答える
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を使用している場合でも、要素をハードコーディングするのではなく、その場で要素を計算する必要がある場合は、この手法が役立ちます。

于 2012-11-15T21:54:12.810 に答える
3

それを試してください:

vector<pair<int,int>> moves{{-2, -1}, {2, 1}, {-1, -2}, {-1, 2},
                            {1, -2},  {1, 2}, {2, -1},  {2, 1}};

初期化リストとUniformInitializationは、C++11で多くの機能を提供します。

于 2012-11-15T21:54:50.490 に答える
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 を使用していない場合、これは 1 つの方法です。それ以外の場合は、@ipc が提案した方法をお勧めします。

于 2012-11-15T22:01:23.340 に答える
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));
        }
    }
}

完全なプログラムは、次のベクトルを生成します。

{-1, -2},
{-1, 2},
{1, -2},
{1, 2},
{-2, -1},
{-2, 1},
{2, -1},
{2, 1},
于 2015-07-31T08:26:25.400 に答える
0

C++11 を使用している場合は、std::vector の代わりに std::array を検討することをお勧めします。通常の配列と同様に、std 配列には固定数の要素があり、使用するデータの量が事前にわかっている場合は、より概念的に意味があります。

于 2012-11-15T23:50:35.333 に答える
-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 ステートメントを追加する方法です。

于 2020-08-13T21:23:51.507 に答える