嗨我需要遍历指针向量的所有可能组合, 我尝试了一些东西,但它没有给出所有的组合(我先对Vector进行了排序)
我首先创建了一个指针比较器:
struct PointerCompare {
bool operator()(const int* l, const int* r) {
return *l < *r;
}
};
问题是我的指针可能具有相同的值,所以为了向您显示问题,我的所有指针都将具有相同的值
int main() {
vector<int*> myValues(4);
for (vector<int*>::iterator it = myValues.begin(); it != myValues.end(); ++it) {
*it = new int(0);
}
std::sort(myValues.begin(), myValues.end(), PointerCompare());
do {
for (vector<int*>::iterator it = myValues.begin(); it != myValues.end(); ++it) {
cout << ' ' << **it;
}
cout << endl;
} while (next_permutation(myValues.begin(), myValues.end(),PointerCompare()));
myValues.clear();
}
所以我首先对vector
进行排序,然后使用相同的比较器询问排列。
当价值观不同时,一切都很好。
所以我的测试结果是:0 0 0
而不是6次(3!
):0 0 0
(这是他应该给我的东西,因为我要求指针的排列而不是值)
我的想法是,当两个指针l
和r
具有相同的值时,l.compare(r)
会返回false,而r.compare(l)
也会返回false,因此他不会将它们交换如果需要,下一个排列。
在这种情况下,当指针具有相同的值时,我应该扩展我的比较器,可能是指针的地址。
我是对的吗?我应该如何比较指针?
编辑:这只是向您展示问题的一个示例(我正在尝试获取指针向量的所有可能排列),我所说的是在那里存在问题是两个或多个指向相同值的指针。例如: p1指向1,p2指向2,p3指向1: 我想拥有所有这些组合: p1 p2 p3,p1 p3 p2,p2 p1 p3,p2 p3 p1,p3 p2 p1,p3 p1 p2 但这不是我得到的,因为他“混淆”了p1和p3
答案 0 :(得分:1)
如果您想要重复的排列,可以使用中间数组:
void print_combination(const std::vector<int*>& v)
{
std::vector<std::size_t> indexes(v.size());
std::iota(indexes.begin(), indexes.end(), 0u);
do {
for (auto index : indexes) {
std::cout << ' ' << *v[index];
}
std::cout << std::endl;
} while (std::next_permutation(indexes.begin(), indexes.end()));
}
答案 1 :(得分:0)
比较器比较值,而不是指针。您应该检查l < r
,而不是*l < *r
。
答案 2 :(得分:0)
我找到了我的问题的答案,使用icepack的答案,我的比较器的问题是,它没有给集合total order,因为计算机无法确定顺序两个指针具有相同的尖头值, 我将比较器更改为:
struct PointerCompare {
bool operator()(const int* l, const int* r) {
if(*l==*r)
return (l<r);
return (*l<*r);
}
};
有了这个,我有一个总订单,这里是{0} 0 {0}的my example的结果