向量。如何设置最大元素数并找到当前计数?

Posted

技术标签:

【中文标题】向量。如何设置最大元素数并找到当前计数?【英文标题】: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

【问题讨论】:

【参考方案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 定义明确。它为您提供向量对象的大小,这与向量对象管理的内存大小无关。

以上是关于向量。如何设置最大元素数并找到当前计数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户定义的谓词查找向量的最大元素

如何找到多维数组的模式?

如何在提升进程间构造具有给定计数的向量并向其添加元素

如何优化 C 代码:寻找下一个设置位并找到相应数组元素的总和

为啥我无法在向量中找到元素的索引? [复制]

如何获取大于数组列表中当前元素的数字元素的计数[关闭]