我对如何在编译时生成素数数组很感兴趣(我相信唯一的方法是使用元编程(在 C++ 中,不确定它在其他语言中是如何工作的))。
快速说明,我不想只说int primes[x] = {2, 3, 5, 7, 11, ...};,因为我想在竞争性编程中使用这种方法,其中源文件不能大于10KB。所以这排除了任何超过几千个元素的预生成数组。
例如,我知道您可以在编译时生成斐波那契数列,但这相当容易,因为您只需添加最后 2 个元素。对于素数,我真的不知道如何在没有循环的情况下做到这一点(我相信这是可能的,但我不知道如何,我猜是使用递归),而且我不知道如何在编译时评估循环-时间。
所以我正在寻找一个关于如何解决这个问题的想法(至少),甚至可能是一个简短的例子
我正在尝试创建一个类 BigInt,其中包含一个带有 D 元素的 std::vector。
template<int D>
class BigInt
{
public:
std::vector<short> digit(D, 0);
};
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息,指出“D”不是一种类型
我有一个Bitset存储 a vectorof chars的类,我希望能够在我使用cout << char时将它char转换为一个 short int ,前提是它是该类的一部分。
代码:
模板<长长X>
类位集
{
公共:std::vector<unsigned char> bit = std::vector<unsigned char> ((X+7)/8);
民众:
/* 构造函数 */
朋友 std::ostream &operator<< (std::ostream &output, const char x);
};
std::ostream &operator<< (std::ostream &output, const char x)
{
输出<<(短)(x);
返回输出;
}
这个想法是,如果我写:
位集 a; /* 代码 */ cout << a.bit[x]; cout<<'a';
我想投a.bit[x]成一个短,但不是'a'那么好。
我知道这是一个愚蠢的问题,我无法理解我是如何陷入困境的,但我在这里。在这段代码中,当我尝试在它声明的范围之外访问x 时(在堆上声明),它告诉我x 未在此范围内声明。
{
int * x = new int;
}
*x = 5; /// Error
Run Code Online (Sandbox Code Playgroud)
我以前从未遇到过这个问题。在我打电话之前x不应该存在delete x;吗?
据我所知,.reserve()为向量保留内存而不实际修改其大小。但这是如何实现的呢?如何只保留内存而不分配内存呢?
编辑:我具体询问如何保留内存而不分配内存,而不是std::vector一般如何工作
所以,我想用它std::map来查找元素是否存在。所以我基本上只需要密钥,不需要任何值。
有什么办法可以做类似的事情std::map<std::string, void>吗?或者std::map对于这种东西有更好的选择吗?
最坏的情况是std::vector<std::string>可以使用不同的容器,但我很好奇您是否可以使用std::map(std::map<std::string, bool>也可以使用,但 bool 会浪费内存)。
c++ ×6
class ×2
vector ×2
c++11 ×1
casting ×1
char ×1
compile-time ×1
containers ×1
dictionary ×1
heap-memory ×1
pointers ×1
primes ×1
scope ×1
stdvector ×1
stl ×1
templates ×1