Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-STL-向量-为什么没有工具指示向量中的U计数_C++_Vector_Stl - Fatal编程技术网

C++ C++;-STL-向量-为什么没有工具指示向量中的U计数

C++ C++;-STL-向量-为什么没有工具指示向量中的U计数,c++,vector,stl,C++,Vector,Stl,考虑到预先为向量保留大小有助于提高应用程序和应用程序的性能,这是非常令人惊讶的 确保在填充时不会发生代价高昂的重新定位 考虑到其容量,为什么没有提供设施来获得搬迁计数 在任何给定的时间,这都可能非常有助于程序员跟踪优化的结果 在可能出现准确容量的情况下,分配给矢量的大小 需要根据观察期间的平均值确定 准确的数字可能事先不知道。要计算std::vector的重新分配,可以将std::vector(或者至少是它的写访问方法)包装到助手类中 示例代码: #include <iostream>

考虑到预先为向量保留大小有助于提高应用程序和应用程序的性能,这是非常令人惊讶的 确保在填充时不会发生代价高昂的重新定位 考虑到其容量,为什么没有提供设施来获得搬迁计数 在任何给定的时间,这都可能非常有助于程序员跟踪优化的结果 在可能出现准确容量的情况下,分配给矢量的大小 需要根据观察期间的平均值确定
准确的数字可能事先不知道。

要计算
std::vector
的重新分配,可以将
std::vector
(或者至少是它的写访问方法)包装到助手类中

示例代码:

#include <iostream>
#include <vector>

template <typename VALUE>
struct AllocCounter {
  std::vector<VALUE> &vec;
  unsigned n;

  AllocCounter(std::vector<VALUE> &vec): vec(vec), n(0) { }
  void push_back(const VALUE &value)
  {
    size_t old = vec.capacity();
    vec.push_back(value);
    n += old != vec.capacity();
  }
};

int main()
{
  std::vector<int> values;
  AllocCounter<int> countAllocs(values);
  for (int i = 1; i <= 1024; ++i) {
    unsigned nOld = countAllocs.n;
    countAllocs.push_back(i);
    if (countAllocs.n > nOld) std::cout << 'R';
    std::cout << '.';
  }
  std::cout << '\n'
    << "Number of (re-)allocations: " << countAllocs.n << '\n';
  // done
  return 0;
}

此示例是一个概念证明,因为它没有考虑“代码> STD::vector:()/代码>,<代码> STD::vector:Resiz()/Cuff>等

顺便说一句,如果直接调用了
std::vector::push_back()
,则计数被旁路(并且可能“忽略”重新分配)


使用自定义分配器可以解决此限制。

您可以将
std::vector::push_back()
封装到一个独立的函数(模板)中,并通过比较新旧
std::vector::capacity()
自行计算。这类问题属于离题问题。显而易见的答案是,此功能需要一个附加的数据变量w/o添加到
vector
的核心功能中。任何真正需要此功能的人都可以轻松地生成自己的
vector
扩展来实现这一目的。“为什么没有?”的一般答案是每个功能都从,只有那些达到正数的东西才有可能被实现对于向量的拷贝,
relocation\u count
应该是什么?移动到向量呢?您是否可以重置计数?