在C ++中使用向量的函数

时间:2013-04-26 19:35:57

标签: c++ vector

我有以下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;
}

哪个应该取两个向量,并返回一个包含在两个输入向量中找到的所有元素的向量 但是,返回的向量总是包含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)

为什么会这样?

另外,在我的findPoss函数中,没有任何内置函数可以同时包含for个循环,是吗?

3 个答案:

答案 0 :(得分:4)

for (int b = 0; b < 9; b += 2) possCol.push_back(b);
当您在possCol循环中使用[0, 2, 4, 6, 8]时,

将使用5填充大小为for (int b = 0; b < 9; b++)的{​​{1}},这将导致未定义的行为

我建议你改用for (int b = 0; b < possCol.size(); b++)for (int a = 0; a < possRow.size(); a++)

答案 1 :(得分:1)

您的代码for (int b = 0; b < 9; b += 2) possCol.push_back(b);会生成一个包含五个元素的向量,但您将在possCol上循环九次,从而获得垃圾内存。 虽然有趣的是你收到了(0, 1, 2, 4, 6, 8)

修改for循环以在findposs函数中读取for (int b = 0; b < possCol.size(); b += 2)将按预期返回{0,2,4,6,8}。

答案 2 :(得分: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;
}