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

前端之家收集整理的这篇文章主要介绍了c – 是否有任何类似数组的数据结构可以在两侧增大?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一名从事高性能计算课程的小型项目的学生,因此效率是一个关键问题.

假设我有一个N浮点数的向量,我想删除最小的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)

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 :: end()之后有一些空格的数组,我会在vector :: begin()之前有一个带有一些空闲空间的容器.

所以问题是:在某些库(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)时间内从矢量中删除元素.

猜你在找的C&C++相关文章