在后C++ 11世界中设置std :: thread实例优先级的正确方法是什么
是否有一种可移植的方式,至少在Windows和POSIX(Linux)环境中有效?
或者是获取句柄并使用特定操作系统可用的本机调用的问题?
我的要求是生成随机字节的数据(非随机数),也就是统一分布的位.
因此,我想知道使用C++ 11/14随机设施执行此操作的正确/有效方法是什么.我的例子有环顾四周,但他们都似乎把重点放在数生成(整数,浮点数等)
我正在使用的当前解决方案如下:
#include <vector>
#include <random>
int main()
{
std::random_device rd;
std::uniform_int_distribution<int> dist(0,255);
std::vector<char> data(1000);
for (char& d : data)
{
d = static_cast<char>(dist(rd) & 0xFF);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 使用下面的代码,我在MSVC中得到一个非常令人困惑的错误,似乎建议将键类型(std :: tuple)转换为std :: string.
#include <iostream>
#include <string>
#include <tuple>
#include <utility>
#include <unordered_map>
typedef std::tuple<std::string,int,char> key_t;
struct key_hash : public std::unary_function<key_t, std::size_t>
{
std::size_t operator()(const key_t& k) const
{
return std::get<0>(k)[0] ^ std::get<1>(k) ^ std::get<2>(k);
}
};
struct key_equal : public std::binary_function<key_t, key_t, bool>
{
bool operator()(const key_t& v0, const key_t& v1) const
{
return (
std::get<0>(v0) == std::get<0>(v1) &&
std::get<1>(v0) == std::get<1>(v1) &&
std::get<2>(v0) == std::get<2>(v1)
);
}
};
struct data
{
std::string x;
};
typedef std::unordered_map<key_t,data,key_hash,key_equal> …
Run Code Online (Sandbox Code Playgroud) 在查看了关于在C++中使用新的"随机"工具的各种示例之后,我对最佳实践感到有些困惑 - 特别是与各种实例的生命周期有关.
例如,在一些示例中,"random_device"的使用在诸如函数的局部范围中是静态的,或者是静态全局变量或者仅仅是本地的.
--- TU ---
static std::random_device global_source;
void foo()
{
static std::random_device local_static_source;
static std::mt19937 gen(local_static_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}
void boo()
{
std::mt19937 gen(global_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}
void roo()
{
std::random_device local_source;
std::mt19937 gen(local_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}
int main()
{
static std::mt19937 gen(global_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
return 0;
}
--- TU ---
Run Code Online (Sandbox Code Playgroud)
Q1:如果多个线程可以访问"foo"或"boo",那么生成器和源是否可以是静态的? - 有没有像shared_ptr那样的线程安全保证?
问题2:标准中是否有任何措辞可以讨论与实例化相关的假设和问题?
为了寻找一个c ++解析器,我最近偶然发现了下面的项目.在其中有一个解析器似乎非常适合我的需求,但我相信作者故意混淆了一些核心代码片段,这使得检查代码有点困难.
https://github.com/ArashPartow/math-parser-benchmark-project/blob/master/fparser/fpoptimizer.cc
文件和作者网站上有一个关于有一个简单的反混淆版本的描述,但是指示的网站似乎只有一个死链接,并且试图联系作者的尝试没有结果.
我想知道其他SOers是否会知道一种快速简便的方法来扭转上述文件中的混淆.
现在我不确定,因为我不是C++专家,但可能是因为代码的存在是合理的原因,可能是因为文件的名称表明它可能是出于性能原因.
std :: pow适用于大多数基本值和指数值的组合.
然而,当基数是负数和分数时,std :: pow龙骨.
在下面的示例中,当预期值大致为:-1.2332863005546时,返回NaN(根据定义)
#include <cmath>
#include <cstdio>
int main()
{
double a = -1.1;
double b = 2.2;
double c = std::pow(a,b);
printf("%5.2f ^ %5.2f = %25.10f\n",a,b,c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:关于如何开发通用pow函数的任何想法,当基数为负时返回非NaN值?
更新 - 总会有一类结果只能用复数表示.
c++ ×6
c++11 ×3
math ×2
random ×2
algorithm ×1
distribution ×1
obfuscation ×1
optimization ×1
parsing ×1
portability ×1
stdthread ×1
stl ×1
tuples ×1