我只是想知道rand(http://www.cplusplus.com/reference/cstdlib/rand/)函数是否会生成相同的随机数序列,同时使用相同的种子,在不同的 libc实现上运行,甚至不同的编译器和操作系统(win,linux).
我使用各种编译器(g ++ 4.8,g ++ 5.1和clang)进行了一些测试,似乎答案是肯定的,但我没有发现任何"正式"提到C的随机数生成中使用的PRNG算法(http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html),还是这些都应该在标准中提到的...
现在我用下面的一段代码dummily转换基本类型(int,long,char[],这种东西),以std::string进行进一步的处理:
template<class T>
constexpr std::string stringify(const T& t)
{
std::stringstream ss;
ss << t;
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
但是我不喜欢它依赖的事实std::stringstream.我尝试使用std::to_string(来自C++ 11的保留节目)然而它会扼杀char[]变量.
有一种简单的方法可以为这个问题提供优雅的解决方案吗?
鉴于:
decltype(auto) f1()
{
int x = 0;
return x; // decltype(x) is int, so f1 returns int
}
decltype(auto) f2()
{
int x = 0;
return (x); // decltype((x)) is int&, so f2 returns int&
}
Run Code Online (Sandbox Code Playgroud)
(摘自Scott Meyer的Effective Modern C++).
现在,如果我找到了正确的段落,则第7.1.5.2节 C++标准的简单类型说明符[dcl.type.simple]说:
如果e是id-expression或类成员访问(5.2.5 [expr.ref]),则decltype(e)被定义为由e命名的实体的类型
而该部分的例子是:
struct A { double x; }
const A* a = new A();
decltype((a->x)); // type is const double&
Run Code Online (Sandbox Code Playgroud)
现在,我想知道为什么被decltype((x))推断出来是int&在书中.
我有以下问题:
我有一个应用程序,它继续产生输出到stderr和stdout.此应用程序的输出在日志文件中捕获(应用程序重定向为:)&> log.txt.我没有任何选项来为此文件生成正确的日志记录.
现在,我有一个cron作业,它每小时运行一次,除了执行其他操作外,它还尝试将上面的日志文件旋转,通过将其复制到log.txt.1然后创建一个空文件并将其复制到log.txt
看起来像:
cp log.txt log.txt.1
touch /tmp/empty
cp /tmp/empty log.txt
Run Code Online (Sandbox Code Playgroud)
问题是,应用程序仍在写入它,因此我在log.txt.1中得到一些非常奇怪的东西,它从很多垃圾字符开始,实际的日志文件在最后的某个地方.
你有什么想法,如何针对这种特定情况制作正确的日志(我也试过cat log.txt > log.txt.1,不起作用)?使用logrotate这个特定的应用程序不是一个选项,幕后有一个我可能不会改变的整个机制.
谢谢,f.
我需要一种"优雅"的方式,在声明阶段初始化一个向量,其中包含另一个和一些额外元素的内容.
我想要解决的是:
让我们考虑以下(示例)声明初始化:
const std::vector<std::string> c90_types = {
"char",
"signed char",
"unsigned char",
"short",
"unsigned short",
"int",
"unsigned int",
"long",
"unsigned long",
"float",
"double",
"long double"
};
const std::vector<std::string> c99_types = {
"char",
"signed char",
"unsigned char",
"short",
"unsigned short",
"int",
"unsigned int",
"long",
"unsigned long",
"float",
"double",
"long double",
"long long",
"unsigned long long",
"intmax_t",
"uintmax_t"
};
Run Code Online (Sandbox Code Playgroud)
你可以看到c99_types有一个完全正确的子集c90_types.我想避免我需要更改子集然后手动更改"超集"的情况,只是为了避免可能引入错误的额外步骤:)
作为旁注,我不想写代码如下:
second.insert(second.begin(), first.begin(), first.end());
second.push_back(something);
Run Code Online (Sandbox Code Playgroud)
对此有什么好的和干净的解决方案?
我有一个插件架构,我在动态库中调用函数,它们返回给我一个char*答案,它在稍后阶段使用.
这是插件函数的签名:
char* execute(ALLOCATION_BEHAVIOR* free_returned_value, unsigned int* length);
Run Code Online (Sandbox Code Playgroud)
这里ALLOCATION_BEHAVIOR必须是:DO_NOT_FREE_ME,FREE_ME,DELETE_ME其中插件(库)告诉我插件如何分配它刚刚返回的字符串:DO_NOT_FREE_ME告诉我,这是我不应该碰(如可变const static char*从不改变)FREE_ME告诉我,我应该free()用来释放返回的值并DELETE_ME告诉我用来delete[]摆脱内存泄漏.
显然,我不相信插件,所以我希望能够检查一下,如果他告诉我free()变量,确实它可以真正被释放......这是否可能使用今天的C/C++技术在Linux/Windows上?
有谁知道重命名mysql存储过程/函数的语法是什么?或者这甚至在MySQL中得到支持?我一直在谷歌上搜索几分钟......
阅读本文时:http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv
我来到这句话:
最后一步,涉及模数除以2 ^ 10 - 1,具有将64位的每组10位(从位置0-9,10-19,20-29,...)合并在一起的效果值.
(它是关于反转数字中的位)...
所以我做了一些计算:
reverted = (input * 0x0202020202ULL & 0x010884422010ULL) % 1023;
b = 74 : 01001010
b
* 0x0202020202 : 1000000010000000100000001000000010
= 9494949494 :01001010010010100100101001001010010010100
& 10884422010 :10000100010000100010000100010000000010000
= 84000010 : 10000100000000000000000000010000
% 1023 : 1111111111
= 82 : 01010010
Run Code Online (Sandbox Code Playgroud)
现在,唯一有点不清楚的部分是1023(2 ^ 10 - 1)的大数量模块并给我反转位的部分......我没有找到关于位操作和位操作之间关系的任何好文档模数运算(旁边x % 2^n == x & (2^n - 1)))所以也许如果有人会对此有所了解,那将是非常有成效的.
我对以下代码执行的操作有点困惑:
class Base
{
public:
Base() = default;
Base(const Base &) =delete;
Base &operator=(const Base &) = delete;
Base(const char*) {}
};
class Holder
{
public:
Holder() = default;
private:
// Base b = Base();
Base b2 = {};
};
int main()
{
Holder h;
}
Run Code Online (Sandbox Code Playgroud)
在这个版本中,它编译,但是如果我取消注释Base b = Base();它会给出以下错误:
main.cpp:15:17: error: use of deleted function 'Base::Base(const Base&)'
Base b = Base();
^
main.cpp:5:6: note: declared here
Base(const Base &) =delete;
^
Run Code Online (Sandbox Code Playgroud)
我只是无法在标准中找到为什么它试图为Base b = Base()初始化程序调用复制构造函数,为什么它不需要 …
我正在尝试制作一个段落列表,其中一个应该被选中,就像下图所示,但似乎我不能成功.
我已经尝试了一些东西:http://jsfiddle.net/bmj2j2wd/但结尾只是没有曲线我想要的方式......即向外,而不是向内.
这是从那里的css:
.active{
border:2px solid dodgerblue;
border-bottom:0;
width:80px;
height:32px;
margin:10px;
position:relative;
border-radius:16px 16px 0 0;
}
.active:after,
.active:before{
content:'';
width:80px;
height:32px;
border:2px solid dodgerblue;
position:absolute;
bottom:-8px;
border-top:0;
}
.active:after{
border-left:0;
border-radius:0 0 16px 0;
down:-16px;
}
.active:before{
border-right:0;
border-radius:0 0 0 16px;
up:-16px;
}
Run Code Online (Sandbox Code Playgroud)
但它看起来完全不对.
非常重要的是曲率之后的两条右线将一直向上和向下直到页面的顶部和底部.
所以,我想请求社区的一些帮助,以使这项工作.