在不破坏元素的情况下调整std :: vector的大小
我一直在使用相同的std::vector<int>
来试图避免分配一个释放所有的时间。 在几行中,我的代码如下所示:
std::vector<int> myVector;
myVector.reserve(4);
for (int i = 0; i < 100; ++i) {
fillVector(myVector);
//use of myVector
//....
myVector.resize(0);
}
在每个迭代中, myVector
将被填充最多4个元素。 为了生成高效的代码,我想总是使用myVector
。 但是,在myVector.resize()
中, myVector
中的元素正在被销毁。 我明白myVector.clear()
会有相同的效果。
我想如果我可以覆盖myVector
的现有元素,我可以节省一些时间。 但是我认为std::vector
不能做到这一点。
有没有办法做到这一点? 创建覆盖元素的本地实现是否有意义?
std :: vector在这种情况下不是解决方案。 你不想重新调整/清除/(重新)分配吗? 别。
好。 使用简单的结构:
struct upTo4ElemVectorOfInts
{
int data[4];
size_t elems_num;
};
并修改fillVector()以保存更多信息:
void fillVector(upTo4ElemVectorOfInts& vec)
{
//fill vec.data with values
vec.elems_num = filled_num; //save how many values was filled in this iteration
}
以同样的方式使用它:
upTo4ElemVectorOfInts myVector;
for (int i = 0; i < 100; ++i)
{
fillVector(myVector);
//use of myVector:
//- myVector.data contains data (it's equivalent of std::vector<>::data())
//- myVector.elems_num will tell you how many numbers you should care about
//nothing needs to be resized/cleared
}
附加说明:
如果您想要更通用的解决方案(以任何类型或大小进行操作),那么您当然可以使用模板:
template <class T, size_t Size>
struct upToSizeElemVectorOfTs
{
T data[Size];
size_t elems_num;
};
并调整fillVector()以接受模板而不是已知类型。
这个解决方案可能是最快的。 你可以这样想:“嘿,如果我想填充100个元素?1000?10000?那么10000?elem阵列会消耗大量存储空间!”。 无论如何它会消耗。 Vector会自动调整大小,并且这种重新分配不在您的控制范围内,因此效率可能非常低。 如果您的阵列相当小并且您可以预测最大需求大小,则始终使用在本地堆栈上创建的固定大小的存储。 它更快,更高效,更简单。 当然这不适用于1.000.000元素的数组(在这种情况下你会得到堆栈溢出)。
你的代码已经有效( myVector.clear()
比myVector.resize(0)
有更好的风格)。
'int destructor'什么都不做。
所以resize(0)
只是将size
设置为0, capacity
不变。
只是不要继续调整myVector
大小。 相反,使用4个元素(使用std::vector<int> myVector(4)
)初始化它,并将其分配给元素(例如myVector[0] = 5
)。
但是,如果它总是固定大小,那么你可能更喜欢使用std::array<int, 4>
。