小编0x4*_*2D2的帖子

C++ 11 std :: to_string(double) - 没有尾随零

今天我尝试了一些C++ 11 STL的新功能并遇到过std::to_string.

可爱,可爱的功能集.为一个双字符串到字符串的转换创建一个stringstream对象对我来说似乎太过分了,所以我很高兴我们现在能做到这样的事情:

std::cout << std::to_string(0.33) << std::endl;
Run Code Online (Sandbox Code Playgroud)

结果?

0.330000
Run Code Online (Sandbox Code Playgroud)

我并不完全满足于此.有没有办法告诉你std::to_string留下尾随的零?我搜索了互联网,但据我所知,该函数只需要一个参数(要转换的值).回到使用stringstreams的'过去',您可以设置流的宽度,但我宁愿不转换回来.

任何人在解决之前遇到过这个问题?一些StackOverflow搜索没有产生任何结果.

(C++ 11 STL参考:http://en.cppreference.com/w/cpp/string/basic_string/to_string)

c++ stl c++11

56
推荐指数
5
解决办法
4万
查看次数

std :: mt19937需要预热吗?

我已经读过许多伪随机数生成器需要许多样本才能"预热".这是使用std :: random_device种子std :: mt19937的情况,还是我们可以期待它在构建后准备就绪?有问题的代码:

#include <random>
std::random_device rd;
std::mt19937 gen(rd());
Run Code Online (Sandbox Code Playgroud)

c++ random standard-library mersenne-twister c++11

46
推荐指数
2
解决办法
1万
查看次数

将int的所有字节设置为(unsigned char)0,保证代表零?

这不是建议的做法(也不是未定义的行为),而是关于将整数类型的所有字节转换为值的c ++标准实际上保证的内容(unsigned char)0.


问题

在下面的代码片段中,if-statement使用的表达式是否保证在被评估为true

std::memset (
  reinterpret_cast<char*> (&a), // int a;
  (unsigned char)0,
  sizeof (int)
);

if (a == 0) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

通过阅读C99和C++ 11标准中的引文(在本文中进一步说明),我们发现C99明确保证所有位设置为的整数类型0将表示该0类型中的值.

我在C++ 11标准中找不到这种保证.

  • 没有这样的保证吗?
  • 上一个代码段的结果是否真的特定于实现?


在C99(ISO/IEC 9899:1999)

5.2.1.2/1多字节字符

所有位为零的字节应被解释为与移位状态无关的空字符.这样的字节不应作为任何其他多字节字符的一部分出现.

6.2.6.2/1整数类型

任何填充位的值都是未指定的.45)符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值.

对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示.



在C++ 11(ISO/IEC 14882:2011)中

2.3/3字符集[lex.charset]

基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别为null宽字符),其表示具有全零位.

c++ language-lawyer c++11

43
推荐指数
1
解决办法
3762
查看次数

C - 将time_t转换为格式为YYYY-MM-DD HH:MM:SS的字符串

有没有办法在保持代码可移植的同时自动将格式为YYYY-MM-DD HH:MM:SS转换time_t为a ?std::string

c

40
推荐指数
2
解决办法
9万
查看次数

使用elem.dataset与IE和JSFiddle的问题

在我在Chrome上创建的这个JSFiddle中,我发现它无法在IE上工作(我正在使用IE9).任何理由:http://jsfiddle.net/ZSB67/.

var backImage = [
    "http://alm7.wikispaces.com/file/view/RedBackground.bmp/144018347/RedBackground.bmp",
    "http://www.time2man-up.com/wp-content/uploads/2011/07/black-background.jpg",
    "http://1.bp.blogspot.com/--GorNQoEUxg/TfWPyckVeMI/AAAAAAAAAHk/0208KqQf3ds/s1600/yellow_background.jpg",
    ""
    ];

function changeBGImage(whichImage) {
    if (document.body) {
        document.body.style.background = "url(\"" + backImage[whichImage] + "\")";
    }
}
var buttons = document.querySelectorAll('.bg_swap'),
    button;

for (var i = 0; i < buttons.length; i++) {
    button = buttons[i];
    button.onclick = function() {
        changeBGImage(this.dataset.index);
    };
}
Run Code Online (Sandbox Code Playgroud)

javascript

39
推荐指数
4
解决办法
3万
查看次数

C++最令人烦恼的解析

直接来自http://herbsutter.com/2013/05/09/gotw-1-solution/

虽然widget w();对我来说很清楚,但我不知道下面的代码如何成为函数声明?

// same problem (gadget and doodad are types)
//
widget w( gadget(), doodad() );  // pitfall: not a variable declaration
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

c++ c++11 gotw

39
推荐指数
1
解决办法
4529
查看次数

使用javascript将文本附加到textarea

如何将文本列表附加到文本区域?

<textarea id="alltext"></textarea>

<ol>
    <li onclick="addText(Hello')">Hello</li>
    <li onclick="addText(World')">World</li>
    <li onclick="addText(Earthlings')">Earthlings</li>
</ol>

<script>
    var Alltext = "";
    function addText(text) {
        Alltext += text
    }
document.getElementById("alltext").value = Alltext;
</script>
Run Code Online (Sandbox Code Playgroud)

由于列表实际上非常长,因此效率非常低.添加的文本正是我在HTML上看到的值,所以没有必要输入两次吧?

有没有更好的方法?

javascript

35
推荐指数
2
解决办法
9万
查看次数

如何检查PHP中是否存在shell命令

我在php中需要这样的东西:

If (!command_exists('makemiracle')) {
  print 'no miracles';
  return FALSE;
}
else {
  // safely call the command knowing that it exists in the host system
  shell_exec('makemiracle');
}
Run Code Online (Sandbox Code Playgroud)

有什么解决方案吗?

php linux exec

33
推荐指数
3
解决办法
2万
查看次数

C++对象的生命周期是什么?

我是一名经验丰富的C开发人员,刚刚进入C++,我必须承认,我对于创建,保留和销毁C++对象有多少种方法感到困惑.在C,生活很简单:与分配=在堆栈上的副本,和malloc/ free堆上管理数据.C++远非如此,或者在我看来.

鉴于此,以下是我的问题:

  1. 什么是所有创建一个C++对象的方法吗?直接/复制构造函数,赋值等.它们如何工作?
  2. 与所有这些类型的对象创建相关联的所有不同的初始化语法是什么?什么之间的区别T f = x,T f(x);,T f{x};,等?
  3. 最重要的是,什么时候复制/分配/ =C++中的任何内容都是正确的,何时你想使用指针?在C中,我非常习惯于在很多地方投掷指针,因为指针分配很便宜但是结构复制不那么容易.C++的复制语义如何影响这个?
  4. 最后,这都是什么东西一样shared_ptr,weak_ptr等?

如果这是一个有点广泛的问题,我很抱歉,但我很困惑何时使用什么(甚至没有提到我对集合和new操作员的内存管理的困惑),我觉得我对C内存管理的一切了解在C++中分解.是真的,还是我的心理模型错了?

总结一下:如何创建,初始化和销毁​​C++对象,以及何时应该使用每种方法?

c++ memory-management

32
推荐指数
2
解决办法
7293
查看次数

同时迭代和修改unordered_set?

请考虑以下代码:

unordered_set<T> S = ...;

for (const auto& x : S)
   if (...)
       S.insert(...);
Run Code Online (Sandbox Code Playgroud)

这打破了吗?如果我们在S中插入一些东西,那么迭代器可能会失效(由于重新散列),这将打破范围 - 因为它在使用S.begin ... S.end.

有一些模式可以解决这个问题吗?

一种方法是:

unordered_set<T> S = ...;

vector<T> S2;

for (const auto& x : S)
   if (...)
       S2.emplace_back(...);

for (auto& x : S2)
    S.insert(move(x));
Run Code Online (Sandbox Code Playgroud)

这看起来很笨重.有没有更好的方法让我失踪?

(特别是如果我使用的是手动哈希表,并且我可以阻止它重新散列直到循环结束,那么使用第一个版本是安全的.)

更新:

来自http://en.cppreference.com/w/cpp/container/unordered_map/insert

如果由于插入而发生重新散列,则所有迭代器都将失效.否则迭代器不会受到影响.引用不会失效.仅当新元素数高于时,才会发生重新散列max_load_factor() * bucket_count().

你能以max_load_factor某种方式搞乱以防止重复吗?

c++ c++11

30
推荐指数
2
解决办法
3690
查看次数