gpt4 book ai didi

c++ - 我怎样才能用静态变量(C++)干掉这些函数?

转载 作者:行者123 更新时间:2023-11-27 23:40:31 24 4
gpt4 key购买 nike

我正在解决 Project Euler 中的一个问题,该问题涉及查找三角形、正方形、五角形、...、八角形数字,因此我正在尝试创建此实用程序来验证每种数字。我决定为每组数字创建筛子以便快速访问,并将其存储在静态数组中。我能够制作一个通用函数来生成每个筛子,但这使得每个验证函数都非常相似。由于它们使用静态 bool 数组的方式,我没有看到避免在这些函数中重复代码的好方法。你有什么想法来干燥这个?

#ifndef FIGURATE_NUMBERS
#define FIGURATE_NUMBERS

#define SIEVE_MAX 10000

void populateFigurateSieve(bool* sieve, const int ADDER_INCREASE)
{
int number = 0;
int adder = 1;

for (int i = 0; i < SIEVE_MAX; i++)
{
if (i == number)
{
sieve[i] = true;
number += adder;
adder += ADDER_INCREASE;
}
else
{
sieve[i] = false;
}
}

return;
}

bool isTriangleNumber(long long int n)
{
static bool triangleNumberSieve[SIEVE_MAX];
static bool initialized = false;

if (!initialized)
{
populateFigurateSieve(triangleNumberSieve, 1);
initialized = true;
}

return triangleNumberSieve[n];
}

bool isSquareNumber(long long int n)
{
static bool squareNumberSieve[SIEVE_MAX];
static bool initialized = false;

if (!initialized)
{
populateFigurateSieve(squareNumberSieve, 2);
initialized = true;
}

return squareNumberSieve[n];
}

bool isPentagonalNumber(long long int n)
{
static bool pentagonalNumberSieve[SIEVE_MAX];
static bool initialized = false;

if (!initialized)
{
populateFigurateSieve(pentagonalNumberSieve, 3);
initialized = true;
}

return pentagonalNumberSieve[n];
}

#endif

最佳答案

我很欣赏您的 C 方法,但在 C++ 中,人们喜欢类。 (-:例如,它们允许您通过对常量值进行抽象来不重复自己。您对三个不同的步长常量具有相同的代码:1、2 和 3,因此您可以使用如下内容为它们创建一个模板:

#include <vector>

constexpr long long SIEVE_MAX = 10000;

template <int ADDER_INCREASE>
class GenericSieve
{
static std::vector<bool> Sieve;

static std::vector<bool> populated_sieve()
{
int number = 0;
int adder = 1;
std::vector<bool> sieve(SIEVE_MAX);

for (int i = 0; i < SIEVE_MAX; i++)
{
if (i == number)
{
sieve[i] = true;
number += adder;
adder += ADDER_INCREASE;
}
else
{
sieve[i] = false;
}
}

return sieve;
}
public:
static bool belongs(long long n)
{
if (Sieve.size() == 0)
{
Sieve = populated_sieve();
}
return Sieve.at(n);
}
};
template<int inc>
std::vector<bool> GenericSieve<inc>::Sieve;

// define a sieve for every number you like
using TriangularSieve = GenericSieve<1>;
using SquareSieve = GenericSieve<2>;
using PentagonalSieve = GenericSieve<3>;

// define functions if you will
bool isTriangleNumber(long long int n)
{
return TriangularSieve::belongs(n);
}
bool isSquareNumber(long long int n)
{
return SquareSieve::belongs(n);
}
bool isPentagonalNumber(long long int n)
{
return PentagonalSieve::belongs(n);
}

如您所见,我主要使用您的代码,但现在都是模板类的静态函数。

关于c++ - 我怎样才能用静态变量(C++)干掉这些函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55409582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com