这是一个简单的 C++ 问题。
问题描述:
我有一个函数,它将一个整数作为输入并返回一个长度为输入的零 vector 。假设我使用相同的参数多次调用该函数。我想避免的是,我的函数每次被调用时都会创建零 vector 。我希望这仅在第一次使用给定输入调用函数时发生。
我是如何处理的: 这让我想起了静态变量。我想创建一个静态 vector 来保存每个大小所需的零 vector ,但无法弄清楚如何实现这一点。例如,我想要一些“看起来”像 [[0], [0,0], ...] 的东西。
如果有其他方法可以解决此类问题,请随时分享!此外,我的 vector 示例有点特殊,但更通用的回复(关于依赖于参数的静态变量)将不胜感激。
附带问题:
进一步概括,是否可以定义一个函数,该函数对于每个参数选择只调用一次 一次 ?
非常感谢。
最佳答案
如果我正确理解您要做什么,我认为您不会获得预期的好处。
我写了一个快速基准来比较重复创建零 vector 的性能。第一个基准使用标准 vector 构造函数。第二个使用的函数只在第一次创建 vector 并将其存储在 map 中:
const std::vector<int>& zeros(std::size_t size) {
static std::unordered_map<size_t, std::vector<int>> vectors;
auto find = vectors.find(size);
if (find != vectors.end())
return find->second;
auto insert = vectors.emplace(size, std::vector<int>(size));
return insert.first->second;
}
std::chrono::duration<float> benchmarkUsingMap() {
int sum = 0;
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i != 10'000; ++i) {
auto zeros10k = zeros(10'000);
zeros10k[5342] = 1;
sum += zeros10k[5342];
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Sum: " << sum << "\n";
return end - start;
}
std::chrono::duration<float> benchmarkWithoutUsingMap() {
int sum = 0;
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i != 10'000; ++i) {
auto zeros10k = std::vector<int>(10'000);
zeros10k[5342] = 1;
sum += zeros10k[5342];
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Sum: " << sum << "\n";
return end - start;
}
int main() {
std::cout << "Benchmark without map: " << benchmarkWithoutUsingMap().count() << '\n';
std::cout << "Benchmark using map: " << benchmarkUsingMap().count() << '\n';
}
输出:
Benchmark without map: 0.0188374
Benchmark using map: 0.134966
因此,在这种情况下,每次创建 vector 几乎快了 10 倍。这是假设您要创建零 vector 的可变拷贝。
关于c++ - 每次选择参数时调用一次的静态变量和函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32311920/