【问题标题】:Vector. How to set the maximum number of elements and find the current count?向量。如何设置最大元素数并找到当前计数?
【发布时间】:2012-02-12 12:24:13
【问题描述】:

我想创建一个最大元素数为 48 的向量,并且我想随时知道向量中当前的元素数。

我使用这个代码:

.h

std::vector< CPPobject* >vec; 

.mm

int maxCountElementInVec = 48; 
vec.resize( maxCountElementInVec );
int countElement  = sizeof( vec ) / sizeof( vec[0] );

printf("%d ",countElement); // return 3

<...>

vec.push_back( some_cpp_obj );
int countElement  = sizeof( vec ) / sizeof( vec[0] );
if( countElement > maxCountElementInVec ) printf("Evrika"); 
printf("%d ",countElement); // return 3

CountElement 始终为 3

【问题讨论】:

    标签: c++


    【解决方案1】:

    您不能设置元素的最大数量。

    然而长度是用

    检索的
    int length = myVector.size();
    

    【讨论】:

      【解决方案2】:

      通过.size()方法可以找到元素个数。

      要设置限制,您可以在std::vector 上创建一个包装器:

      template<typename T>
      class MyVector : public std::vector<T>
      {
          int _maxSize;
      public:
          void setMaxSize(int maxSize) {_maxSize = maxSize;}
          void push_back(const T& element)
          {
              if (std::vector<T>::size() < _maxSize)
                 std::vector<T>::push_back(element);
              else
              {
                 //disallow - throw exception or whatever
              }
          }
      };
      

      【讨论】:

      • 如果 MyVector 向上转换为 std::vector,这可能会泄漏。但是,将您的继承更改为私有(并根据需要公开尽可能多的 std::vector 接口)并且这不会泄漏。
      【解决方案3】:

      包装不好。这为内存泄漏打开了大门,因为 std::vector 没有虚拟析构函数。

      让我们泄漏一些内存:

      // Construct std::vector & MyVector
      std::vector * v = dynamic_cast<std::vector *>( new MyVector() ); 
      // Destruct only std::vector
      delete v;
      

      这是 MyVector 的构造,无需调用它的析构函数。

      发疯吧:

      MyVector * mv = new MyVector(); // Construct std::vector & MyVector
      
      std::vector * v = dynamic_cast<std::vector *>( mv );
      delete v; // Destruct only std::vector
      
      mv.resize(74); // Usage of a partially destroy object.
      

      那是使用部分销毁的对象。让我们旋转麻烦的轮子!

      【讨论】:

      • 正确,但不回答 OP 的问题。可以使用私有继承甚至普通封装来包装 std::vector 而没有泄漏的风险。
      【解决方案4】:

      获取向量中的元素个数非常简单。只需致电vec.size()。您不能限制向量的大小不超过保留的大小。

      您查询的是向量结构的大小超过简单指针的大小。向量的元素不是这个大小的一部分 - 因此你得到恒定的大小。

      【讨论】:

        【解决方案5】:

        我不认为 STL 向量上的 sizeof 在这里做了非常有用的事情。正如 Kerrek 在评论中指出的那样,它不会评估与向量中元素数量成正比的东西。只需使用size() 即可获取向量中当前包含的元素数。

        您可以切换到提供 fixed_vector 的 EASTL,它就像一个向量,除了所有内存都是预先分配的,因此它不能增长到超过您指定的数量。不过,它仍然维护一个 size() 来跟踪插入了多少元素。

        【讨论】:

        • 当然sizeof 定义明确。它为您提供向量对象的大小,这与向量对象管理的内存大小无关。
        猜你喜欢
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2012-12-27
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多