在下列情况下,为什么vector <int>比vector <bool>更快

时间:2015-09-28 10:45:43

标签: c++ vector

当我编写LeetCode问题N-Queens时,会发现这种现象。

我有两个版本的接受代码,唯一的区别是我存储哈希表的方式,一个使用vector<int>而另一个使用vector<bool>。具体而言,两个版本的代码如下:

版本1,vector<int>,运行时间:4毫秒
class Solution {
public:
void dfs(vector<string>& crtrst, vector<vector<string>>& finalrsts, int row, vector<int>& mup, vector<int>& m45dgr, vector<int>& m135dgr)
{
    int n = crtrst.size();

    if (row == n)
    {
        finalrsts.push_back(crtrst);
        return;
    }

    for (int j=0; j<n; j++)
    {
        if (mup[j] && m45dgr[j-row+n-1] && m135dgr[row+j])
        {
            crtrst[row][j] = 'Q';
            mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = 0;

            dfs(crtrst,finalrsts,row+1,mup,m45dgr,m135dgr);

            crtrst[row][j] = '.';
            mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = 1;
        }
    }
}

vector<vector<string>> solveNQueens(int n) 
{
    vector<vector<string>> finalrsts;
    vector<string> crtrst(n,string(n,'.'));
    vector<int> mup(n,1);
    vector<int> m45dgr(2*n-1,1); // degree 45: '\'
    vector<int> m135dgr(2*n-1,1); // degree 135: '/';
    int row = 0;
    dfs(crtrst,finalrsts,row,mup,m45dgr,m135dgr);
    return finalrsts;
}
};
版本2,vector<bool>,运行时间:12毫秒
class Solution {
public:
void dfs(vector<string>& crtrst, vector<vector<string>>& finalrsts, int row, 
    vector<bool>& mup, vector<bool>& m45dgr, vector<bool>& m135dgr)
{
    int n = crtrst.size();

    if (row == n)
    {
        finalrsts.push_back(crtrst);
        return;
    }

    for (int j=0; j<n; j++)
    {
        if (mup[j] && m45dgr[j-row+n-1] && m135dgr[row+j])
        {
            crtrst[row][j] = 'Q';
            mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = false;

            dfs(crtrst,finalrsts,row+1,mup,m45dgr,m135dgr);

            crtrst[row][j] = '.';
            mup[j] = m45dgr[j-row+n-1] = m135dgr[row+j] = true;
        }
    }
}

vector<vector<string>> solveNQueens(int n) 
{
    vector<vector<string>> finalrsts;
    vector<string> crtrst(n,string(n,'.'));
    vector<bool> mup(n,true);
    vector<bool> m45dgr(2*n-1,true); // degree 45: '\'
    vector<bool> m135dgr(2*n-1,true); // degree 135: '/';
    int row = 0;
    dfs(crtrst,finalrsts,row,mup,m45dgr,m135dgr);
    return finalrsts;
}
};

据我所知,vector<bool>使用1位而不是bool变量(可能是2字节)存储每个元素,vector<int>使用4字节存储每个元素。所以vector<bool>似乎比vector<int>更小。但是,为什么它比vector<int>慢?

2 个答案:

答案 0 :(得分:8)

访问单个位通常比完成可寻址单元(C ++的术语中的字节)慢。例如,要写一个字节,只需发出一条写指令(mov on x86)。要写一个位,需要加载包含它的字节,使用按位运算符在字节中设置正确的位,然后存储结果字节。

位向量的紧凑大小很适合存储要求,但除非数据变得足够大以致缓存问题发挥作用,否则会导致速度减慢。

如果您希望获得速度并且仍然比每个值4个字节更有效,请尝试vector<unsigned char>

答案 1 :(得分:3)

我的解释:

vector<type>有一个bool专门化,这是一个位图;这在存储方面非常高效(矢量存储的1Byte = 8 bool),但实际访问数据时更糟糕;对于任何其他vector,您只需通过n访问*([address of first element + n * sizeof(element)])位置的元素,但是为了获得字节存储,您将不可避免地需要做一些位操作,在大型缓存时,可能比只有一个int s数组慢得多,每个都代表一个真值。