C++ 为什么我不能用std::next\u置换生成所有置换?

C++ 为什么我不能用std::next\u置换生成所有置换?,c++,stl,c++14,permutation,C++,Stl,C++14,Permutation,我试图获得二进制值的所有排列,在本例中,使用C++14 STL中的 然而,我确实认为我在这个方法中发现了一个bug。 如果向量的末端有一个或多个零,则无法获得向量的所有置换 例如,让我们考虑向量STD::向量A= {1,0,0}。std::next_置换找到的唯一置换是{100},而存在三种可能的置换{100,01,01} 这是虫子吗?如果是,我可以在哪里报告 你可以在C++ shell中访问我的代码。它也显示在下面 #include <iostream> #include <

我试图获得二进制值的所有排列,在本例中,使用C++14 STL中的

然而,我确实认为我在这个方法中发现了一个bug。 如果向量的末端有一个或多个零,则无法获得向量的所有置换

例如,让我们考虑向量STD::向量A= {1,0,0}。std::next_置换找到的唯一置换是{100},而存在三种可能的置换{100,01,01}

这是虫子吗?如果是,我可以在哪里报告

<>你可以在C++ shell中访问我的代码。它也显示在下面

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

int main() {

  std::vector<int> a = {1,0,0,0};
  std::vector<int> b = {0,0,0,1};

  std::cout << "Permutations of a" << std::endl;
  do {
    for (int i = 0; i < a.size(); i++) {
      std::cout << a[i];
    }
  std::cout << std::endl;
  } while (std::next_permutation(a.begin(), a.end()));
  
  
  std::cout << std::endl << "Permutations of b" << std::endl;
  
  do {
    for (int i = 0; i < b.size(); i++) {
      std::cout << b[i];
    }
    std::cout << std::endl;
  } while (std::next_permutation(b.begin(), b.end()));
  exit(0);
}
从:

将范围[首先,最后]排列到下一个排列中,其中所有排列的集合按字典顺序排列,相对于运算符<或comp

所以迭代排列只能得到从初始范围开始按字典顺序递增的序列


请注意,参考页底部的示例对初始范围执行std::sort以生成所有置换。

来自C++20标准[alg.permutation.generators]:

效果:采用范围定义的序列[首先,最后一个,并将其转换为下一个排列。下一个排列是通过假设所有排列的集合是根据comp和proj按字典顺序排序的来发现的。如果不存在这样的排列,则将序列转换为第一个排列;即,升序排列


您的a已经在最后一次排列中,因此函数返回false。就像b达到相同状态时一样。

在断定它是一个错误之前,您是否阅读了任何文档?如果下一次排列在最后一次排列后没有停止,您的循环将永远不会结束,因此它确实是一个功能。不要试图猜测函数的功能仅就其名称而言,它可能会经常出错。不幸的是,链接的网页不是参考,即使它被称为非常有用的页面,但。@Acorn我通常使用参考,甚至使用措辞/规则/等,而不区分链接是否指向eel.is/c++draft或cppreference.com显然只是前者对于语言律师的问题。你认为它需要从文本中清楚地知道它是什么吗?这不是什么大不了的事,但一般来说,我避免把任何网络称为引用,当然更不用说引用,除非它是实际的引用。当然,新的C++程序员可能会把它误认为是许多其他语言的官方文档。此外,这是一个任何人都可以编辑的维基。
Permutations of a
1000

Permutations of b
0001
0010
0100
1000