Hi我需要循环遍历指针向量的所有可能组合,我尝试了一些东西,但它并没有给出所有的组合(我首先对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,所以如果需要,他不会在下一个排列中交换它们。在这种情况下,当指针具有相同的值时,我应该扩展我的比较器,也许是指针的地址。我说的对吗?我应该如何比较指针?
EDIT:这只是一个向您展示问题的例子(我正在尝试获得指针向量的所有可能排列),我想说的是,当有两个或多个指针指向同一值时,这就有问题了。例如: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
如果想要重复排列,可以使用中间数组:
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()));
}
实例
比较器比较的是值,而不是指针。您应该检查是否为l < r
,而不是*l < *r
。
我使用icepack的答案找到了我的问题的答案,我的比较器的问题是,它没有给出集合的总顺序,因为计算机无法决定具有相同指针值的两个指针的顺序,我把我的比较器改为:
struct PointerCompare {
bool operator()(const int* l, const int* r) {
if(*l==*r)
return (l<r);
return (*l<*r);
}
};
有了这个,我有了一个总订单,这是我的例子0 0 0 的结果
具有一些不同值的其他示例