排序向量<向量<bool>>基于向量<bool>的内容
sorting vector<vector<bool>> based on the content of vector<bool>
我有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
如果不将它们转换为十进制,很容易判断出最上面的一个更大。前三位数字相同,但第四位数字在顶部数字中较大。其余的都无关紧要,这会使顶部的数字更大。因此,将其用作气泡排序中的交换条件非常简单。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中