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

时间:2009-03-01 21:06:59

标签: c++ cross-platform vector

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

处理动态创建新元素,这些元素将附加到矢量。

我期待创建大约2 * N个额外元素, 所以我将矢量调整为3 * N.

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

有没有办法检测到它在AIX / TRU64 / Linux之间可以移植?

5 个答案:

答案 0 :(得分:3)

检测什么?矢量是否会调整大小?是不是已经?

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

e.g

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);
}

答案 1 :(得分:3)

你为什么使用矢量?向量的整个点是在需要时动态扩展。

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

答案 2 :(得分:2)

创建自己的类,该类将委托给向量。并在你自己的push_back中检查大小。

答案 3 :(得分:2)

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

如果你只是在运行时知道它,就像在这里所说的那样,你应该将你的向量封装在一个具有特定函数的类中,这些函数将检查你想要的条件(例如通过断言)。

在最后一种方法中,如果你能知道向量创建时的最大大小,我建议保留(std :: vector :: reserve())封装类构造函数中向量的最大大小(或者初始化功能)。这样,矢量本身将不再有内存操作(仅当矢量元素构造函数/析构函数执行此类操作时)。然后,添加一个简单的断言来检查向量容量(std :: vector :: capacity())在类的所有函数的开头和结尾都没有改变,这将有助于确保它的内存不会移动。 / p>

例如(假设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!" ); }

};

或类似的......

答案 4 :(得分:2)

std类使用每次插入元素时调用的分配器。您可以编写一个继承自std :: alocator的新分配器,并添加所需的所有类型的检查/跟踪。

(我之前做过这个,但我花了一些时间制作工作代码。)