草庐IT

c++ - Foreach 范围迭代 vector<int> - auto 或 auto&?

游戏引擎微优化情况:我正在使用C++11范围for循环迭代vector,与auto关键字。什么更快:for(autovalue:ints)...或for(auto&value:ints)...? 最佳答案 在关心哪个更快之前,你应该关心哪个在语义上是正确的。如果你不需要改变被迭代的元素,你应该选择第一个版本。否则,您应该选择第二个版本。当然,您可能会反对,即使您不需要更改vector的内容,仍然可以选择使用对const的引用:for(autoconst&value:ints)然后问题就变成了:哪个更快?通过引用const还是通过值?

c++ - C++11 基于范围的 for 循环条件是否在每个循环中都得到评估?

for(auto&entity:memoryManager.getItems())entity->update(mFrameTime);如果memoryManager包含1000个项目,是否memoryManager.getItems()在循环开始时被调用1000次还是只调用一次?编译器是否使用-O2(或-O3)运行任何优化?(memoryManager.getItems()返回一个std::vector&) 最佳答案 它只被评估一次。该标准将基于范围的for语句定义为等同于:{auto&&__range=range-init;fo

c++ - 混合 Boost FOREACH 宏和 OpenMP 并行化

我目前有一个代码(在C中)带有一个OpenMP并行化的外循环(它在共享内存列表上本地运行)。我正在用C++重写它,对于很多事情,我发现BOOST_FOREACH宏是一种非常好的语法,作为循环构造用于迭代列表、数组等。我的问题是:有没有一种方法既可以使用该语法又可以并行化OpenMP样式的循环? 最佳答案 从终端复制值1千字:$g++a.cpp-I/opt/boost-1.45.0/include-O-fopenmpa.cpp:Infunction‘intmain()’:a.cpp:12:error:forstatementexpec

C++0x 用基于范围的 for 循环替换 for(int i;;) 范围循环的方法

所以我一直在使用GCC4.6进入新的C++,它现在具有基于范围的for循环。我发现这非常适合迭代数组和vector。主要出于审美原因,我想知道是否有办法用它来代替标准for(inti=min;i用类似的东西for(int&i:std::range(min,max)){}新的C++标准中是否有内置的东西允许我这样做?还是我必须编写自己的范围/迭代器类? 最佳答案 我在任何地方都看不到它。但这将是相当微不足道的:classrange_iterator:publicstd::input_iterator{intx;public:range

c++ - 基于范围的 for 循环和 ADL

C++0xstandardworkingdraft声明(第6.5.4节)以下关于隐含在基于范围的for循环中的begin()和end()调用:'begin'and'end'arelookedupwithargument-dependentlookup(3.4.2).Forthepurposesofthisnamelookup,namespacestdisanassociatednamespace.按照我的理解,这意味着为调用begin()和end()设置的重载决议包括以下所有内容:在使用基于范围的for循环的位置范围内的begin()和end()的所有重载(特别是,全局命名空间中的所有

C++/STL:std::transform 给定步幅?

我有一个包含Nd数据的一维数组,我想用std::transform或std::for_each有效地遍历它。unignedintnelems;unsignedintstride=3;//wearegoingtohave3Dpointsfloat*pP;//thiswillkeepxyzxyzxyz...Load(pP);std::transform(pP,pP+nelems,strMover(pP,stride));//HowtodefinethestrMover?? 最佳答案 答案不是改变strMover,而是改变你的迭代器。定义

c++ - 有没有用 C++11 中基于范围的 for 循环替换 BOOST_FOREACH 的经验?

您是否经历过将BOOST_FOREACH替换为基于范围的for循环的过程?机械地(即没有对周围的代码进行深入研究)时是否有任何问题?背景:我确实有大约25万行的源代码,是使用MicrosoftVC++10(VisualStudio2010)编译的。该代码还使用了boost库中的BOOST_FOREACH。我只是在尝试使用auto实现基于范围的for循环的VC++11(VisualStudio2012RC)。到目前为止,我遇到过元素声明在BOOST_FOREACH之外的情况(括号内没有声明):BOOST_FOREACH(element,container){...}...并且元素应该在b

c++ - 如何参数化迭代器方向?

基本上我在做以下事情:std::setindices;//..fillindicesif(flag){//weneedtoprocessinascendingorderBOOST_FOREACH(inti,indices){process(i);}}else{//weneedtoprocessindescendingorderBOOST_REVERSE_FOREACH(inti,indices){process(i);}}我想知道是否有一种方法可以在C++03中只调用一次process(i)来编写相同的东西,以某种方式对处理顺序进行参数化?像这样(显然即使在C++0x中也不起作用,因为

c++ - 在容器元素上应用函数需要更好的名称

我有一个容器类(包含一个多索引容器),我有一个公共(public)的“foreach”成员函数,因此用户可以传递一个仿函数以应用于所有元素。在实现时,我遇到了这样一种情况,即仿函数只能应用于容器中范围内的某些元素,因此我重载了foreach,以传递一些有效范围。现在,在某些情况下,在某个条件下停止是值得的,所以实际上,我让foreach根据函数的返回值停止。我对系统的工作方式很满意,但我有一个顾虑:应该如何调用范围内带有停止条件的“foreach”?谁知道一个通​​用、清晰和简洁的名称? 最佳答案 根据您的描述,我会选择apply_

c++ - 如何迭代 QListWidget 中的每个项目

我只能在互联网上找到任何示例如何循环并获取QListWidget中的每个项目 最佳答案 intcount=listWidget->count();for(intindex=0;indexitem(index);//Awilditemhasappeared}我认为foreach完全不同。如果你想了解更多信息,请看这个http://doc.qt.digia.com/4.2/containers.html#the-foreach-keyword向下滚动到它谈论foreach关键字的地方。特别感谢TomalakGeret'kal添加了我的键