向量。如何设置最大元素数并找到当前计数?
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
定义明确。它为您提供向量对象的大小,这与向量对象管理的内存大小无关。以上是关于向量。如何设置最大元素数并找到当前计数?的主要内容,如果未能解决你的问题,请参考以下文章