【问题标题】:C++ Most efficient way iterate specific contents in vectorC ++最有效的方法迭代向量中的特定内容
【发布时间】:2015-05-24 06:57:00
【问题描述】:

我有两个向量,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) 做到这一点。我也可能完全错了。

感谢您的帮助!

【问题讨论】:

  • std::sort(begin(p), end(p)); 足够T* 可比。
  • @Jarod42:“我觉得有一种比排序函数的 O(nlogn) 更有效的方法。”我将标题重命名为更清晰。
  • @MooingDuck:我的意思是对于O(n log n) 解决方案,我的意思是不需要“自定义比较功能”作为 OP。

标签: c++ sorting pointers vector


【解决方案1】:

放弃了一些心理上的想法后,我想到了一个简单的:

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 的实现。

【讨论】:

  • 我认为您刚刚重新发明了计数排序。 en.wikipedia.org/wiki/Counting_sort
  • @StilesCrisis:不完全...等等...是的,我做到了,因为值是指针,而不是T。无论哪种方式,O(n)。
  • 甜蜜。出于好奇,为什么要使用 chars 向量来表示 bools 而不仅仅是 bools 向量?
  • 从历史上看,vector 一直是一个可怕的特例,它试图打包位,但违反了大多数关于 vector 如何工作的规则。我不确定,但我认为这可能已在较新的 C++ 规范中得到修复,但大多数程序员仍然避免使用 vector
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2014-07-21
  • 2013-10-01
  • 2013-07-16
  • 2022-10-19
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多