vector针对大对象的优化

Fastlist容器通过存储对象指针而非对象本身的方式,优化了对于大对象的插入和遍历操作,提高了vector容器在处理大对象时的性能。

vector在可用空间不足,进行某些插入操作的时候就会重新分配空间,然后再进行一系列的拷贝工作,如果对象比较大,那么拷贝起来是非常缓慢的。有没有办法提高拷贝时的速度呢。办法是有的。那就是以空间换取时间。vector只存取大对象的指针。指针的大小是固定的,比较小的。这样就能提高拷贝的速度。当然如果是小对象也那么干,速度不但不会提升,反到会下降。白白多了一些内存分配动作。下面是一个实现:

#ifndef FASHLISH_H
#define FASHLISH_H

#include<vector>
namespace lytool

 using namespace std;

 struct __fastlist_iterator_base
   {
   typedef size_t size_type;
   typedef ptrdiff_t difference_type;
   typedef random_access_iterator_tag iterator_category;
   };

 template<typename T, typename Ref, typename Ptr>
 struct __fastlist_iterator: public __fastlist_iterator_base
 {
  typedef __fastlist_iterator<T, T&, T*>   iterator;
  typedef __fastlist_iterator<T, const T&, const T*> const_iterator;
  typedef __fastlist_iterator<T, Ref, Ptr>  self;

        typedef T value_type;
  typedef Ptr pointer;
  typedef Ref reference;
       
  typename vector<T*>::iterator node;

  __fastlist_iterator(){}

  __fastlist_iterator(typename vector<T*>::iterator iter)
  { node = iter; }

  __fastlist_iterator(const self& other)
  { node = other.node; }

  reference operator* () const { return **node; }
  pointer operator-> () const { return &(operator*()); }

  self& operator= (const self& other)
  {
   if( this == &other)
    return *this;

   node = other.node;
   return *this;
  }
       
  self& operator++ ()
  {
   ++node;
   return *this;
  }

  self operator++ (int)
  {
   self temp = *this;
   ++node;
   return temp;
  }

  self& operator-- ()
  {
   --node;
   return *this;
  }

  self operator-- (int)
  {
   self temp = *this;
   --node;
   return temp;
  }

  self operator+= (int n)
  {
   node + = n;
   return *this
  }

  self operator-= (int n)
  {
   return operator+= (-n);
  }

  self operator+ (int n)
  {
   return operator+= (n);
  }

  self operator- (int n)
  {
   return operator-= (n);
  }

  bool operator== (const self& other)
  {
   return (node == other.node);
  }

  bool operator!= (const self& other)
  {
   return !(operator== (other));
  }

 };

 template<typename T>
 class fastlist
 {
 public:
  typedef T value_type;
  typedef value_type* pointer;
        typedef const value_type* const_pointer; 
  typedef value_type& reference;
  typedef const value_type&  const_reference;
  typedef size_t size_type;
  typedef ptrdiff_t difference_type;

  typedef __fastlist_iterator<T, T&, T*> iterator;
  typedef __fastlist_iterator<T, const T&, const T*> const_iterator;

 private:
  vector<T*> data;

 private:
  pointer construct()
  {
   return new T;
  }

  pointer construct(const T& other)
  {
   return new T(other);
  }

  void destruct(T* p)
  {
   delete p;
  }
 public:
        iterator begin()
  {
   return iterator(data.begin());
  }

  iterator end()
  {
   return iterator(data.end());
  }

  size_type size()
  {
   return data.size();
  }

  bool empty()
  {
   return data.empty();
  }

  reference front()
  {
   return *begin();
  }

  reference back()
  {
   return *( end() - 1 );
  }

  void insert(const T& other,iterator iter)
  {
           pointer p = construct(other);
     data.insert(iter.node, p);
  }

  void push_back(const T& other)
  {
   pointer p = construct(other);
   data.push_back(p);
  }

  void push_front(const T& other)
  {
   insert(other, begin());
  }

  void pop_back(const iterator& iter)
  {
   data.pop_back(*(iter.node));
  }

  void pop_front(const iterator& iter)
  {
   data.pop_front(*(iter.node));
  }

  void erase(iterator iter)
  {
           destruct(*(iter.node));
  }

        void clear()
  {
   iterator iter = begin();
   iterator iterend = end();
   for(;iter != iterend; ++iter)
   {
    destruct(*(iter.node));
   }
   data.clear();
  }

        fastlist()
  {
  }

  fastlist(const fastlist& other)
  {
   data = other.data;
  }

  ~fastlist()
  {
   clear();
  }
 };
}
#endif 

 上面的Fastlist容器的优点是针对大对象而言,插入和遍历速度都快于
vector,遍历速度当然更是远快于list(名字的由来)
此外,提供了符合c++标准的迭代器,可以使用的一些C++中的一些算法。但由于这个迭代器还没有完工,有的方法还没有实现,所以有些算法还不能使用。

### 如何优化使用 Vector 构建图形的最佳实践和方法 #### 使用高效的几何计算库 为了提高性能,在处理复杂的向量图形时,应考虑采用专门设计用于高效执行几何运算的库。这些库通常实现了经过高度优化的数据结构和算法来加速常见的操作,比如路径简化、布尔运算以及变换等[^1]。 #### 减少不必要的对象创建 频繁实例化新的 `Vector` 对象会带来额外开销并可能导致垃圾回收压力增大。尽可能重用已存在的对象池中的资源可以有效降低这种影响。对于临时性的中间结果存储,则推荐利用栈分配而非堆分配的方式以进一步提升效率[^2]。 #### 应用批处理技术 当绘制大量相似类型的图元(如线条、矩形或多边形)时,可以通过一次性提交多个命令给 GPU 或者 CPU 渲染管线来进行批量处理。这不仅减少了上下文切换的时间损耗,还允许硬件更好地发挥其并行处理能力[^3]。 #### 实施空间分区策略 针对大规模场景下的矢量绘图应用,引入适当的空间索引机制(例如四叉树或R-tree),能够显著加快碰撞检测与可见性判断的速度。通过预先划分区域并将关联的对象组织起来,查询请求可以在更短的时间范围内得到响应[^4]。 ```cpp // C++ 示例:实现简单的四叉树节点类 class QuadTreeNode { public: std::vector<Object*> objects; QuadTreeNode* children[4]; // 子节点指针数组 void insert(Object* obj); bool contains(const Object& obj) const; }; ``` #### 利用缓存机制 如果某些部分的图像内容相对静态不变,那么将其渲染成果保存下来作为位图纹理供后续重复使用是非常明智的选择。这样做的好处是可以避免反复重新计算相同的视觉效果,从而节省宝贵的CPU/GPU周期[^5]。 #### 合理设置精度参数 在不影响最终显示质量的前提下适当地放宽数值表示法上的严格程度有助于减少浮点数运算次数及其带来的舍入误差累积风险。具体做法包括但不限于调整坐标系缩放比例因子或是选用较低分辨率但足以满足需求的颜色模型[^6]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值