草庐IT

point_list

全部标签

c++ - 为什么在 C++11 中为 std::initializer_list 重载 std::begin() 和 std::end()?

在C++11(引用N3337)中,std::begin()和std::end()被指定为(§24.7[iterator.range]/p2-3)templateautobegin(C&c)->decltype(c.begin());templateautobegin(constC&c)->decltype(c.begin());2Returns:c.begin().templateautoend(C&c)->decltype(c.end());templateautoend(constC&c)->decltype(c.end());3Returns:c.end().但是,std::in

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++ - 为什么要为 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++ - OpenCV 是否为 cv::Point 提供平方范数函数?

我必须根据距离阈值检查点之间的几个距离。我能做的是取阈值的平方并将其与(a-b)的平方范数进行比较,其中a和b是我正在检查的点。我知道cv::norm函数,但我想知道是否存在不计算平方根的版本(因此速度更快),或者我是否应该手动实现它。 最佳答案 注释来自OP:我接受了这个答案,因为这是使用OpenCV可以实现的最佳方法,但我认为在这种情况下最好的解决方案是使用自定义函数。是的,它是NORM_L2SQR:#include#includeusingnamespacecv;usingnamespacestd;intmain(){vect

c++ - 在一个简单的 Point 类中,是否有任何关于 getters/setters 而不是公共(public)成员变量的真正论据?

我有两个用于处理3d几何Point和Vector的简单类。它们都有3个坐标作为公共(public)成员变量,并定义了一些运算符,如+、-、*...。classPoint{public:doublex,y,z;//ctorandsomeoperators}classVector{public:doublex,y,z;//ctorandsomeoperators}是否有反对将坐标公开的真正理由?我永远不会将double更改为任何其他类型。我不想将x,y,z的值限制在一个特殊范围内,我也不想在设置坐标时检查任何内容。这些类位于库中,其他项目将使用该库。更新:对我来说,setters/gett

c++ - 返回并自动推导 std::initializer_list

在以下内容中:autox={0};//autodeductionofstd::initializer_listautoy=[]()->std::initializer_list{return{0};}();//explicitautoz=[](){return{0};}();//won'tcompile为什么不能返回并自动推断std::initializer_list的类型? 最佳答案 好吧,因为标准是这么说的,而且因为braced-init-list不是表达式。根据C++11标准的第5.1.2/4段:[...]Ifalambda-