是否有可能调整std :: vector的大小会降低其容量?

Ano*_*oah 2 c++ stl vector c++11

我有这个容器: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;
      }
Run Code Online (Sandbox Code Playgroud)

结果是:

合并/缩小前的总容量:254396100

合并/缩小后的总容量:107010297

因此容量似乎受到影响.

还有一些示例代码,其中resize不会影响向量的容量.

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;
}
Run Code Online (Sandbox Code Playgroud)

用gcc编译(Ubuntu 6.2.0-5ubuntu12)6.2.0

Pet*_*ter 6

创建矢量副本时,副本将具有相同的大小,但不一定与原始副本具有相同的容量.

在你的表单循环中

for(auto itr : rvec1)
Run Code Online (Sandbox Code Playgroud)

itr将是一个元素的副本rvec1.获取对实际元素的引用使用

for(auto &itr : rvec1)
Run Code Online (Sandbox Code Playgroud)

要么

for(const auto &itr : rvec1)
Run Code Online (Sandbox Code Playgroud)