函数中的c++大向量被多次调用

c++ big vector in function called multiple times

本文关键字:调用 向量 c++ 函数      更新时间:2023-10-16

我有一个函数,它为内部工作创建了一个大向量。假设我们还需要多次调用此函数。处理向量的内存创建/销毁的最佳方法是什么(因素包括性能、代码质量等(

方法1:

void f(int n) {
    vector<int> v(n);
 }
 int main() {
     for (int i = 0; i < 1000000; ++i) f(10000000);
 }

方法2:

void f(int n) {
    static vector<int> v;
    v.reserve(99999999); // say this is the maximum possible size
    v.resize(n);
}
 int main() {
     for (int i = 0; i < 1000000; ++i) f(10000000);
 }

方法2肯定比方法1快,但它看起来很难看。的最佳方法是什么

将函数转换为具有operator()的类。

class f_class {
   std::vector<int> v;
public:
   f_class()
   {
        v.reserve(99999999);
   }
   void operator()(int n)
   {
        v.resize(n);
        // Whatever the original f() did
   }
};
int main() {
     f_class f;
     for (int i = 0; i < 1000000; ++i) f(i);
}

根据您的示例,您的向量大小是相同的,为什么不只创建一个向量呢?

  using namespace std;
    void f(vector<int>& v) {
        // Do something with vector
    }
    int main() {
        int n = 10000000;
        vector<int> v(n);
        for (int i = 0; i < 1000000; ++i)
            f(v);
    }
v.reserve() //deals with capacity.
v.resize(n) //deals with size.

在方法2中,静态向量所经历的只是改变大小,然而,保留空间大于大小,因此容量没有变化,并且当您在循环中迭代时,它只增加了一。因此,尺寸每次只增加一个。容量没有变化通常如果对int的空向量调用resize,则该resize范围内的向量元素将初始化为0。

在方法1中,创建的向量大小为n,但具有最接近的n<2^k整数值作为容量(例如,如果n=100,则容量128,当n=200,则容量256,依此类推(。此外,当您调用方法one时,每次函数超出范围时,都会创建并销毁它。需要注意的是,向量是空的,因为它没有任何值。

在方法2中,矢量是静态的并且保持不变。

可能想要阅读:

保留

容量

此外,如果您有向量保留内存,并且假设可能不受内存量的困扰,则通过摊销分析进行恒定插入的内存预分配将为每个操作生成一个Big-O(1(。