-1

次の C++ 関数があります。

std::vector<int> findPoss (std::vector<int>& possRow, std::vector<int>& possCol)
{
    std::vector<int> poss;
    for (int a = 0; a < 9; a++)
        for (int b = 0; b < 9; b++)
            if (possRow[a] == possCol[b])
                poss.push_back(possRow[a]);
    return poss;
}

2 つのベクトルを取り、両方の入力ベクトルで見つかったすべての要素を含むベクトルを返す必要があります。
ただし、返されるベクトルには常に 1 が含まれます。たとえば、次のように入力した場合:

std::vector<int> possRow;
for (int a = 0; a < 9; a++) possRow.push_back(a);
std::vector<int> possCol;
for (int b = 0; b < 9; b += 2) possCol.push_back(b);
findPoss(possow, possCol)

これは次のように返されます。

(0, 1, 2, 4, 6, 8)

これはなぜですか?

また、私の関数には、両方のループを 1 つにfindPoss含む組み込み関数はありませんね。for

4

3 に答える 3

4
for (int b = 0; b < 9; b += 2) possCol.push_back(b);

未定義の動作を引き起こすループ内で使用している間possCol[0, 2, 4, 6, 8]which のサイズが取り込まれます。5for (int b = 0; b < 9; b++)

for (int b = 0; b < possCol.size(); b++)代わりにandを使用することをお勧めしますfor (int a = 0; a < possRow.size(); a++)

于 2013-04-26T19:43:16.030 に答える
1

コードfor (int b = 0; b < 9; b += 2) possCol.push_back(b);は 5 つの要素を持つベクトルを生成しますが、possCol を 9 回ループして、ガベージ メモリを取得しています。結果として受け取ったのは興味深いですが(0, 1, 2, 4, 6, 8)

その for ループをfor (int b = 0; b < possCol.size(); b += 2)findposs 関数で読み取るように変更すると、期待どおり {0, 2, 4, 6, 8} が返されます。

于 2013-04-26T19:48:51.503 に答える
0

範囲ベースの for ループにより、これが非常にきれいになります。

std::vector<int> findPoss (const std::vector<int>& possRow, const std::vector<int>& possCol)
{
    std::vector<int> poss;
    for (int row : possRow)
        for (int col : possCol)
            if (row == col)
                poss.push_back(row);
    return poss;
}
于 2013-04-26T21:06:49.483 に答える