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

时间:2015-04-22 07:17:40

标签: c++ vector compare permutation

嗨我需要遍历指针向量的所有可能组合, 我尝试了一些东西,但它没有给出所有的组合(我先对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,因此他不会将它们交换如果需要,下一个排列。 在这种情况下,当指针具有相同的值时,我应该扩展我的比较器,可能是指针的地址。 我是对的吗?我应该如何比较指针?

编辑:这只是向您展示问题的一个示例(我正在尝试获取指针向量的所有可能排列),我所说的是在那里存在问题是两个或多个指向相同值的指针。例如: 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

3 个答案:

答案 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()));
}

Live example

答案 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的结果

other example with some different values