我有2000 vector<vector<bool>>
,每个vector<bool>
包含200个元素,我将对这个向量向量进行排序。假设vector<bool>
中的元素是一个二进制数。
原始数据:
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());
,顺序为上面的“排序后”。
为什么没有特殊的谓词就可以了?
答案 0 :(得分:5)
仅仅应用在标头std::sort
中声明的标准算法<algorithm>
就足够了,因为对于向量定义了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::accumulate
std::sort
答案 1 :(得分:3)
std::sort可以采用比较功能。因此,只需在std::vector<bool>
上定义一个比较函数就可以达到预期效果。
因此,您需要定义一个关于如何比较不同长度的两个std::vector<bool>
的约定。
答案 2 :(得分:0)
对外部矢量的元素(也是矢量)使用简单的气泡排序算法,交换的条件是:
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 */
因为如果你取两个二进制数,迭代它们,并比较每个相应的数字,那么两个数字中较大的一个是具有最高位数的一个数字而另一个数字中的相应数字是0像这样:
0011010110101010000111011011
0010101011101000011101101010
如果不将它们转换为十进制,很容易判断出顶部更大。前三个数字相同,但第四个数字在顶部数字中更大。其余的并不重要,这使得最高的数字更大。因此,在泡沫分类中使用它作为交换条件很简单。