c++ - 是否有任何类似数组的数据结构可以在两侧增长?

标签 c++ arrays memory-management data-structures vector

我是一名学生,正在为高性能计算类(class)做一个小项目,因此效率是一个关键问题。

假设我有一个包含 N 个 float 的 vector ,我想删除最小的 n 个元素和最大的 n 个元素。有两种简单的方法可以做到这一点:

一个

sort in ascending order    // O(NlogN)
remove the last n elements // O(1)
invert elements order      // O(N)
remove the last n elements // O(1)

B

sort in ascending order     // O(NlogN)
remove the last n elements  // O(1)
remove the first n elements // O(N)

在 A 中反转元素顺序需要交换所有元素,而在 B 中移除前 n 个元素需要移动所有其他元素以占据留空的位置。使用 std::remove 会产生同样的问题。

如果我可以免费移除前 n 个元素,那么解决方案 B 会更便宜。这应该很容易实现,如果不是有一个 vector ,即在 vector::end() 之后有一些空白空间的数组,我会在 之前有一个有一些空闲空间的容器 vector::开始()

所以问题是:在某些库(STL、Boost)中确实已经存在一个类数组(即连续内存,无链表),允许 O(1) 插入/删除数组的两边?

如果没有,您认为有比创建这样的数据结构更好的解决方案吗?

最佳答案

您是否考虑过将 std::partition 与自定义仿函数一起使用,如下例所示:

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>
class greaterLess {
    T low;
    T up;
  public:
    greaterLess(T const &l, T const &u) : low(l), up(u) {}
    bool operator()(T const &e) { return !(e < low || e > up); }
};

int main()
{
    std::vector<double> v{2.0, 1.2, 3.2, 0.3, 5.9, 6.0, 4.3};
    auto it = std::partition(v.begin(), v.end(), greaterLess<double>(2.0, 5.0));
    v.erase(it, v.end());

    for(auto i : v) std::cout << i << " ";
    std::cout << std::endl;

    return 0;
}

这样您就可以在 O(N) 时间内从 vector 中删除元素。

关于c++ - 是否有任何类似数组的数据结构可以在两侧增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23824986/

相关文章:

c++ - 如何判断 std::vector 是否调整了自身大小,以及如何解释指向 vector 内值的指针不再有效?

c++ - 在连续内存中存储任意元素

被调用的对象 'strn' 不是一个函数

c++ - 关于删除通过 placement new 创建的对象的困惑

javascript - 打印山脉算法

arrays - 循环移位数组 R

wolfram-mathematica - Apply与Map的内存使用情况。虚拟内存的使用和锁定

c++ - 如何根据 Qt 中的图形形状仅使按钮的一部分对用户操作(单击/如何/等)使用react?

c++ - 在对话框/窗口上有选择地启用视觉样式

c++ - 使用 Eclipse 调试外部控制台程序