草庐IT

UInt8List

全部标签

c++ - 为什么 std::min(std::initializer_list<T>) 按值获取参数?

阅读thisquestion的答案,我惊讶地发现std::min(std::initializer_list)按值获取其参数。如果您使用std::initializer_list以其名称所暗示的方式,即作为某个对象的初始值设定项,我知道我们不关心复制它的元素,因为它们无论如何都会被复制以初始化对象。然而,在这种情况下,我们很可能不需要任何拷贝,因此将参数视为std::initializer_list似乎更合理。如果可能的话。这种情况下的最佳做法是什么?你不应该调用initializer_list吗?std::min的版本如果您关心不要进行不必要的复制,或者是否有其他一些技巧可以避免复制

c++ - 保留 std::initializer_list 的拷贝是否安全?这是什么道理?

在我的环境中,std::initializer_list被实现为指向第一个元素和大小的指针。仍然在我的特定设置中,我能够观察到:底层数据在当前函数帧中分配(因为指向第一个元素的指针是这样说的)从函数按值返回initializer_list不会更改指针的值(得出数据未与initializer_list一起复制的结论)。这使得复制initializer_list变得不安全,如果拷贝的生命周期比原始对象长。C++标准的进一步发布是否会维持这种行为?同样重要的是,这种行为背后的基本原理是什么?(今天真的很痛,所以我会天真地说这违背了“最不惊讶”的原则) 最佳答案

c++ - std::initializer_list 类型推导

最近写了一个很简单的类。classC{public:voidAddString(std::initializer_list>x){//irrelevant}};intmain(){Cc;c.AddString({{"1",1},{"2",2},{"3",3}});....//otherunimportantstuffreturn0;}令我惊喜的是,它编译并正常工作。有人可以向我解释一下编译器是如何推断出嵌套的大括号初始值设定项是用于std::pair的吗?我正在使用MSVS2013。 最佳答案 c.AddString({{"1",1

c++ - 从 0 到最大值的 uint64_t 键的最佳哈希函数是什么?

假设我们有一组元素并希望将它们存储在HashMap中(例如std::unordered_set),并且每个元素都有一个uint64_t类型的键其值可以从0到其最大可能值变化,使用普通散列函数是否是最佳选择,其中键的散列值是键本身?它是否取决于使用的容器(即Google的稀疏哈希与来自STL的std::unordered_map)?键值出现的概率未知。 最佳答案 如果您需要散列的只是具有未知概率的任何可能值的uint64_t,并且您的输出必须是uint64_t,那么您不会通过更改该值获得任何优势。只需使用key本身。如果您对值的分布有

c++ - 为什么要为 std::forward_list 拼接整个列表或线性范围?

将范围从一个列表拼接到另一个列表可以在常数时间内完成,但代价是使size()的复杂度呈线性。C++11改变了std::list的情况,要求size()为常数时间。例如,这破坏了gcc的实现,参见[C++0x]std::list::sizecomplexity.除了splice()范围外,还有什么其他原因size()不能成为常量时间在早期,C++03符合std::listimplementations?为什么拼接整个列表或范围是线性的std::forward_list?参见splice_after(),案例(1)和(3)。另见standarddraftN3485中的23.3.4.6for

c++ - 将 braced-init-list 分配给数组是否正确?

关闭。这个问题不符合StackOverflowguidelines。它目前不接受答案。这个问题似乎与helpcenter中定义的范围内的编程无关。关闭9年前。Improvethisquestion标准说,5.17/9下Abraced-init-listmayappearontheright-handsideof-anassignmenttoascalar[...]-anassignmentdefinedbyauser-definedassignmentoperator[..]在GCC4.5.1-pre9999中,我可以编译它(使用-std=c++0x,而不是-std=gnu++0x)#

c++ - 为什么这个 initializer_list 在传递字符串时使用了错误行为?

我已经尝试了我的G++版本的C++0x初始化列表实现,但它只输出空行。#include#include#includeintmain(){std::initializer_lista({"hello","stackoverflow"});for(autoit=a.begin(),ite=a.end();it!=ite;++it)std::cout我不知道我做错了什么。谁能帮帮我吗? 最佳答案 在上面的示例中,您似乎正在创建两个初始化列表。临时{"hello","stackoverflow"}和std::initializer_lis

c++ - 无法从 uint32_t* 转换为 LPDWORD

我正在尝试调用WindowsAPI函数GetExitCodeProcess,它以LPDWORD作为第二个参数。根据MSDN,LPDWORD是指向无符号32位值的指针。所以我尝试传递uint32_t*,但编译器(MSVC11.0)对此不满意:errorC2664:'GetExitCodeProcess':cannotconvertparameter2from'uint32_t*'to'LPDWORD'static_cast也无济于事。这是为什么?在这种情况下使用reinterpret_cast是否安全? 最佳答案 来自document

C++ 为什么按位运算符 ~ 在 uint64_t 和 uint8_t 上返回不同的类型?

#include#includeintmain(){usingnamespacestd;uint64_ta=3;if(uint64_t(~a)==(~a))cout~uint8_t返回int值,但~uint64_t返回uint64_t。这是未定义的行为吗? 最佳答案 发布自en.cppreferenceTheresultofoperator~isthebitwiseNOT(one'scomplement)valueoftheargument(afterpromotion).Integralpromotion适用于char,short

c++ - 从 std::stringstream 读取 uint8_t 作为数字类型

我的理解是,从stringstream读取uint8_t是一个问题,因为stringstream将解释uint8_t作为char。我想知道如何从stringstream中读取uint8_t作为数字类型。比如下面的代码:#include#includeusingnamespacestd;intmain(){uint8_tui;std::stringstreamss("46");ss>>ui;cout打印出52。我希望它打印出46。编辑:另一种方法是从stringstream中读取一个string,然后将解决方案转换为uint8_t,但这破坏了nice链接属性。比如在我实际要写的代码中,经