这是一个简单的 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/

10-11 23:18
查看更多