使用主键和辅键的指针向量的组合



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(这是他应该给我的,因为我要求的是指针的排列,而不是值)

我的想法是,当两个指针lr具有相同的值时,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 的结果

具有一些不同值的其他示例

相关内容

  • 没有找到相关文章

最新更新