代码之家  ›  专栏  ›  技术社区  ›  EvilTeach

矢量大小调整-便携式检测方法

  •  0
  • EvilTeach  · 技术社区  · 17 年前

    我有一个向量,我正在加载已知数量的元素(N)。

    我预计将创建大约2*N个附加元素, 所以我将向量调整为3*N。

    如果额外的元素超过这个值,我希望程序中止,而不是向量的动态扩展。

    是否有一种在AIX/TRU64/Linux之间可移植的方法来检测这种情况?

    5 回复  |  直到 17 年前
        1
  •  3
  •   Andrew Grant    17 年前

    实现这一点的唯一真正方法是在自定义分配器或向向量添加元素的函数中提供检查功能。

    template<class T> 
    void add_element(std::vector<T>& container, T const& v)
    {
      if (container.capacity()+1 >= 3*N)
      {
        // terminate/exception/whatever
      }
    
     container.push_back(v);
    }
    
        2
  •  3
  •   Ken    17 年前

    你为什么要用向量?向量的全部要点是在需要时动态扩展。

    与其让一个类委托给向量,不如让一个类委托给一个简单数组。让您的push_back检查大小,并在需要时中止。

        3
  •  2
  •   Mykola Golubyev    17 年前

        4
  •  2
  •   Klaim    17 年前

    如果您在编译时知道大小,可以使用std::tr1::array(或 boost::array )这将是一个更好的选择。它保持一个固定的大小,并像std::vector一样检查访问。

    在最后一种方法中,如果您可以知道向量创建时的最大大小,我建议您在封装类构造函数(或初始化函数)中保留(std::vector::reserve())向量的最大大小。这样,向量本身就不会有更多的内存操作(仅当向量元素构造函数/析构函数进行此类操作时)。然后,添加一个简单的断言来检查向量容量(std::vector::capacity())在类的所有函数的开始和结束时是否从未更改,这将帮助您确保它的内存不移动。

    例如(假设DATA_MAX_SIZE是某个地方定义的默认最大大小):

    template< typename MyType >
    class MyData
    {
    public:
        MyData( unsigned long max_size = DATA_MAX_SIZE )
            : m_max_size( max_size )
            { m_data.reserve( m_max_size ); }
    
        void add( const MyType& value ) { check_capacity(); m_data.push_back( value ); check_capacity(); }
    
    
    
    private:
    
        std::vector< MyType > m_data;
        const unsigned long m_max_size;
    
        void check_capacity() { if( m_data.capacity() != m_max_size ) throw Exception("Useful error message here!" ); }
    
    };
    

    或者类似的事情。。。

        5
  •  2
  •   Ben    17 年前

    (我以前做过这个,但我花了一段时间来编写工作代码。)