我有这个容器:std :: vector< std :: tuple,std :: vector> > rvec1 其中每个内部向量包含许多元素。 在一些计算之后,我调整内部向量的大小。 问题是,当我测量每个向量的容量时,它似乎会减少。 这是正常的吗?
这是我调整向量大小的函数:
int merge_vector_elements(std::vector< std::tuple<std::vector<int>,std::vector<float> > >& rvec1){
long totalCapacity = 0;
for(auto itr : rvec1){
totalCapacity += std::get<0>(itr).capacity();
totalCapacity += std::get<1>(itr).capacity();
}
std::cout<<"Total Capacity before merge / shrink: "<<totalCapacity<<std::endl;
int nnz = 0;
for (msize_t i=0; i<rvec1.size(); i++){
int count = 0;
for(msize_t j = 0; j < std::get<0>(rvec1[i]).size(); ++j, ++count){
std::get<0>(rvec1[i])[count] = std::get<0>(rvec1[i])[j];
std::get<1>(rvec1[i])[count] = std::get<1>(rvec1[i])[j];
while((j+1 != std::get<0>(rvec1[i]).size()) && std::get<0>(rvec1[i])[count] == std::get<0>(rvec1[i])[j+1]){
std::get<1>(rvec1[i])[count] += std::get<1>(rvec1[i])[j+1];
j++;
}
}
std::get<0>(rvec1[i]).resize(count);
//std::get<0>(rvec1[i]).shrink_to_fit();
std::get<1>(rvec1[i]).resize(count);
//std::get<1>(rvec1[i]).shrink_to_fit();
nnz += count;
}
totalCapacity = 0;
for(auto itr : rvec1){
totalCapacity += std::get<0>(itr).capacity();
totalCapacity += std::get<1>(itr).capacity();
}
std::cout<<"Total Capacity after merge / shrink: "<<totalCapacity<<std::endl;
return nnz;
}
结果是:
合并/缩小前的总容量:254396100
合并/收缩后的总容量:107010297
所以容量似乎受到了影响。
还有一些示例代码,其中调整大小不会影响向量的容量。
int main(){
long bufferSize = 1000000000;
std::vector<double> newVec(bufferSize);
for(int i=0; i<bufferSize; i++){
newVec[i] = i * 8.99;
}
std::cout<<"Capacity before resize: "<<newVec.capacity()<<std::endl;
newVec.resize(bufferSize / 2);
// newVec.shrink_to_fit();
std::cout<<"Capacity after resize: "<<newVec.capacity()<<std::endl;
return 0;
}
使用gcc(Ubuntu 6.2.0-5ubuntu12)6.2.0进行编译
答案 0 :(得分:6)
创建矢量副本时,副本的大小相同,但不一定与原始副本相同。
在你的表格循环中
ec2_ami
for(auto itr : rvec1)
将是itr
元素的副本。要获得对实际元素的引用,请使用
rvec1
或
for(auto &itr : rvec1)