C++ 如何将值为false的所有成员排序到向量的末尾?

C++ 如何将值为false的所有成员排序到向量的末尾?,c++,vector,boolean,stdvector,C++,Vector,Boolean,Stdvector,我想按布尔值对向量进行排序。名单如下: std::vector<bool> bolis {true true false true false false true true}; 我看到了std::sort函数,但它似乎唯一真正的用途是对整数或浮点列表进行排序,而不是布尔列表。第一种方法: true true true true true false false false 这可以通过定义自定义比较器函数并将其传递给排序函数来实现 请看一下实施情况,如下所示: #include

我想按布尔值对向量进行排序。名单如下:

std::vector<bool> bolis {true true false true false false true true};

我看到了
std::sort
函数,但它似乎唯一真正的用途是对整数或浮点列表进行排序,而不是布尔列表。

第一种方法:

true true true true true false false false 
这可以通过定义自定义比较器函数并将其传递给
排序
函数来实现

请看一下实施情况,如下所示:

#include <iostream>
#include <vector>
#include <algorithm>



//define the function:
bool comparator(bool lhs, bool rhs) { return rhs < lhs; }

int main()
{
    std::vector<bool> bolis {true, true, false, true, false, false, true, true};
    
    // pass it to sort:
    sort(bolis.begin(), bolis.end(), &comparator);
    
    for(int i=0;i<bolis.size();i++){
        std::cout<<(bolis[i] ? "true " : "false ");
    }
    std::cout<<std::endl;
}
O(N)时间复杂度中的第二种方法:

true true true true true false false false 
计算向量中真值和假值的数量,并相应地打印它们

例如,如果有5个真值和2个假值,则打印5次为真,打印2次为假

或者您也可以在另一个向量中推送值或编辑原始向量。


感谢@john为改进答案提供的所有建议第一种方法:

true true true true true false false false 
这可以通过定义自定义比较器函数并将其传递给
排序
函数来实现

请看一下实施情况,如下所示:

#include <iostream>
#include <vector>
#include <algorithm>



//define the function:
bool comparator(bool lhs, bool rhs) { return rhs < lhs; }

int main()
{
    std::vector<bool> bolis {true, true, false, true, false, false, true, true};
    
    // pass it to sort:
    sort(bolis.begin(), bolis.end(), &comparator);
    
    for(int i=0;i<bolis.size();i++){
        std::cout<<(bolis[i] ? "true " : "false ");
    }
    std::cout<<std::endl;
}
O(N)时间复杂度中的第二种方法:

true true true true true false false false 
计算向量中真值和假值的数量,并相应地打印它们

例如,如果有5个真值和2个假值,则打印5次为真,打印2次为假

或者您也可以在另一个向量中推送值或编辑原始向量。


感谢@john为改进答案提供的所有建议

对std::vector进行排序是一种非常特殊的情况,可以通过非常特殊的解决方案来完成:

计算
true
元素的数量,然后基于此计数重写向量

示例代码:

#include <vector>
#include <iostream>

int main()
{
  std::vector<bool> bolis {true, true, false, true, false, false, true, true};
  // count number of true
  size_t nT = 0;
  for (bool value : bolis) nT += value == true;
  // write sorted vector
  for (size_t i = 0, n = bolis.size(); i < n; ++i) bolis[i] = i < nT;
  // show result
  const char *sep = "";
  for (bool value : bolis) {
    std::cout << sep << std::boolalpha << value;
    sep = ", ";
  }
}

对std::vector进行排序是一种非常特殊的情况,可以通过非常特殊的解决方案来完成:

计算
true
元素的数量,然后基于此计数重写向量

示例代码:

#include <vector>
#include <iostream>

int main()
{
  std::vector<bool> bolis {true, true, false, true, false, false, true, true};
  // count number of true
  size_t nT = 0;
  for (bool value : bolis) nT += value == true;
  // write sorted vector
  for (size_t i = 0, n = bolis.size(); i < n; ++i) bolis[i] = i < nT;
  // show result
  const char *sep = "";
  for (bool value : bolis) {
    std::cout << sep << std::boolalpha << value;
    sep = ", ";
  }
}

标准库中的函数专为完成您想做的事情而设计。它接受一个范围和一个谓词,并对该范围的元素重新排序,以便根据该谓词对它们进行分区:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>


int main()
{
    std::vector<bool> bolis {true, true, false, true, false, false, true, true};

    //reorder so that true comes first    
    std::partition(bolis.begin(), bolis.end(), [](bool b){return b;});

    std::cout << std::boolalpha;
    std::copy(bolis.begin(), bolis.end(), std::ostream_iterator<bool>(std::cout, " " ));
    
    return 0;    
}
这里有一个。

标准库中的函数是专为您想做的事情而设计的。它接受一个范围和一个谓词,并对该范围的元素重新排序,以便根据该谓词对它们进行分区:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>


int main()
{
    std::vector<bool> bolis {true, true, false, true, false, false, true, true};

    //reorder so that true comes first    
    std::partition(bolis.begin(), bolis.end(), [](bool b){return b;});

    std::cout << std::boolalpha;
    std::copy(bolis.begin(), bolis.end(), std::ostream_iterator<bool>(std::cout, " " ));
    
    return 0;    
}

这里有一个。

看看。
std::sort
当然可以使用。但是,由于只有两个值,因此更简单的解决方案肯定存在。请看一看。
std::sort
当然可以使用。然而,由于只有两个值,更简单的解决方案肯定存在谢谢@John。换了,没问题。我喜欢你在回答中提到O(N)。很明显,布尔向量可以按O(N)排序,只需进行计数,然后在适当的位置指定false或true。谢谢@John!还添加了关于编辑原始向量的建议。
comparator
不需要(默认值是正确的)。谢谢@John。换了,没问题。我喜欢你在回答中提到O(N)。很明显,布尔向量可以按O(N)排序,只需进行计数,然后在适当的位置指定false或true。谢谢@John!还添加了关于编辑原始向量的建议。
comparator
不需要(默认值是正确的)。