我试图找到每个有2个对象的元素的排列和组合--nC2或nP2。我可以通过以下代码找到这些组合。有没有优雅的方法来重写这个?另外,有没有办法找到排列?以下只是一个例子,我的数据集由近2000个元素组成。所以,速度也是一个因素。
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> array = {"a", "b", "c", "d", "e"};
std::vector<std::string>::iterator it = array.begin();
for ( ; it < array.end(); it++ ) {
for (std::vector<std::string>::iterator it_next = it+1 ; it_next < array.end(); it_next++ ) {
std::cout << *it << *it_next << "\n";
}
}
}
节目输出 -
gcc版本4.6.3
AB AC 广告 AE 公元前 BD 是 光盘 CE 德
答案 0 :(得分:0)
好吧,如果您只想要所有组合的排列,那么它非常简单,因为每个组合中只有两个项目。所以简单地反转打印 - 如:
std::vector<std::string> array = {"a", "b", "c", "d", "e"};
std::vector<std::string>::iterator it = array.begin();
for ( ; it < array.end(); it++ ) {
for (std::vector<std::string>::iterator it_next = it+1 ; it_next < array.end(); it_next++ ) {
std::cout << *it << *it_next << "\n";
// Print the permutation - simply swap the order
std::cout << *it_next << *it << "\n";
}
}
}
旧答案,我误解了OP想要的内容
另外,有没有办法找到排列?
是的,它可以通过多种方式完成,但std::next_permutation
似乎很合适。
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
// Print the vector
void pv(const std::vector<std::string>& v)
{
for (const auto& s : v)
{
std::cout << s << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<std::string> array = {"a", "b", "c"};
std::sort(array.begin(), array.end());
do
{
pv(array);
} while(std::next_permutation(array.begin(), array.end()));
}
输出:
a b c
a c b
b a c
b c a
c a b
c b a
答案 1 :(得分:0)
相对于组合的初始代码,您可以通过使用[]而不是迭代器遍历向量来提高性能:
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
int main() {
std::vector<std::string> array = { "a", "b", "c", "d", "e" };
int current;
int next;
for (current = 0; current < array.size(); ++current)
{
for (next = current + 1; next < array.size(); ++next)
{
std::cout << array[current] << array[next] << "\n";
}
}
return 0;
}