函数中的c++大向量被多次调用
c++ big vector in function called multiple times
我有一个函数,它为内部工作创建了一个大向量。假设我们还需要多次调用此函数。处理向量的内存创建/销毁的最佳方法是什么(因素包括性能、代码质量等(
方法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(。
相关文章:
- 变量没有改变?通过向量的函数调用
- 在c++中使用向量时,如何调用构造函数和析构函数
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 向量推回调用析构函数时调用析构函数
- 在具有向量的类构造函数中进行析构函数调用
- 使用并行参数向量调用元素向量的成员函数
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 调用向量的函数,给定向量的指针作为 void *
- 使用多个输入向量中值的笛卡尔乘积调用 lambda
- 如何从 node-ffi 调用 c++ 中以结构向量作为参数的方法?
- 在 c++ 中,如何使用向量调用派生类?
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 在不同的线程中调用向量析构函数或清除
- 调用向量没有匹配函数
- 调用向量内的函数指针不执行任何操作
- C++从另一个类调用(向量)指针返回空大小
- c++没有用于调用向量push_back的匹配函数
- 调用C++向量的每个元素的成员函数
- 如何调用向量大小作为一个函数
- 我"does not name a type"制作的类的简单调用向量