C ++最有效的方法迭代向量中的特定内容

时间:2015-03-20 18:46:42

标签: c++ sorting pointers vector

我有两个向量,vec和p,这样p就是指向vec中不同位置的指针的向量。

类似于:

p[0] = &vec[12]
p[1] = &vec[20]
p[3] = &vec[1]

等。 p的大小始终小于或等于vec,并且不包含对vec中相同位置的重复引用。

我想要的是一些数据结构,我可以迭代通过它们在a中指向的索引的顺序获取p的解除引用值。因此对于上面的例子,结果需要按照vec [1],vec [12],vec [20]的顺序进行迭代。

我知道可以获得vec中的位置p指向做p[i] - &vec[0]之类的东西,并且可能使用std :: sort和自定义比较函数来实现这个,但我觉得还有更多比排序函数的O(nlogn)更有效的方法。我也可能完全错了。

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

在抛弃一些心理想法之后,我想到了一个简单的想法:

std::vector<char> is_pointed_to(vec.size(), 0);//initialize the "bools" to "false"
//set is_pointed_to values
for(T* pointer : p) {
    size_t orig_index = pointer - &vec[0];
    is_pointed_to[orig_index] = 1; //set this index to "true"
}
//now do the iteration
for(int i=0; i<vec.size(); ++i) {
    if(is_pointed_to[i]) {
        //DO TASK HERE
    }
}

这显然是一个两遍算法,所以O(n)。容易。

StilesCrisis提醒我这是counting sort的实现。