排序向量<向量<bool>>基于向量<bool>的内容

sorting vector<vector<bool>> based on the content of vector<bool>

本文关键字:gt lt 向量 bool 排序 于向量      更新时间:2023-10-16

我有2000个vector<vector<bool>>,每个vector<bool>包含200个元素,我将对向量的这个向量进行排序。假设CCD_ 3中的元素是一个二进制数。

原始数据:

vector 1: 1,1,1
vector 2: 1,0,1
vector 3: 0,0,0
vector 4: 1,0,0

分拣后:

vector 3: 0,0,0
vector 4: 1,0,0
vector 2: 1,0,1
vector 1: 1,1,1

可以将sort与一个特殊的谓词一起使用,但令人惊讶的是,当我在没有谓词的情况下调用sort时,它似乎无论如何都能工作。

    vector<bool> A = {1, 1, 1};
    vector<bool> B = {1, 0, 1};
    vector<bool> C = {0, 0, 0};
    vector<bool> D = {1, 0, 0};
    vector < vector<bool> > v = {A,B,C,D};
    sort(v.begin(),v.end());

顺序如上面的"排序后"。

为什么它在没有特殊谓词的情况下工作?

只要应用标头<algorithm>中声明的标准算法std::sort就足够了,因为为向量定义了operator <,前提是所有布尔向量都具有相同的大小。

以下是的示例

#include <iostream>
#include <vector>
#include <algorithm>
int main() 
{
    std::vector<std::vector<bool>> v =
    {
        { 1, 1, 1 }, { 1, 0, 1 }, {0, 0, 0 }, { 1, 0, 0 }
    };
    std::sort( v.begin(), v.end() );
    for ( const std::vector<bool> &v1 : v )
    {
        for ( bool b : v1 ) std::cout << b << ' ';
        std::cout << std::endl;
    }
    return 0;
}

输出为

0 0 0 
1 0 0 
1 0 1 
1 1 1 

否则,您可以在std::sort 的谓词中使用算法std::accumulate

std::sort可以使用Compare函数。因此,只需在std::vector<bool>上定义一个比较函数,即可执行您所期望的操作。

因此,您需要定义一个关于如何比较不同长度的两个std::vector<bool>的约定。

顺便说一句,看起来你正在重新发明bignum,为什么不使用一些现有的库,比如gmplib?

对外部向量的元素(也是向量)使用一个简单的气泡排序算法,交换的条件是:

for (int i=0; i<200; i++)
    if (vec1[i] > vec2[i]) vec1.swap(vec2);
    /* vec1 and vec2 are the two vectors you
    compare when bubble sorting the outer vector */

因为如果你取两个二进制数,对它们进行迭代,并比较每个对应的数字,那么这两个数字中较大的一个数字是最高的数字,它是1,另一个数字中对应的数字是0。像这样:

0011010110101010000111011011

0010101011101000011101101010

如果不将它们转换为十进制,很容易判断出最上面的一个更大。前三位数字相同,但第四位数字在顶部数字中较大。其余的都无关紧要,这会使顶部的数字更大。因此,将其用作气泡排序中的交换条件非常简单。