草庐IT

c++ - 设计迭代器包装器

我编写了一个包装迭代器并按需返回转换后值的类://iterator-wrapper.htemplateclassIteratorWrapper{Itercur_;constIterlast_;constFctfct_;public:IteratorWrapper(Iterfirst,Iterlast,constFctfct):cur_(first),last_(last),fct_(fct){}constValValue()const{returnfct_(*cur_);}voidNext(){++cur_;}boolDone()const{returncur_==last_;}};现

c++ - 如何让 tr1::array 分配对齐内存?

您可以分配一个std::vector,它通过定义您自己的分配器来分配对齐的堆内存。您可以使用declspecalign在堆栈上分配一个c风格的数组。但是你能声明一个tr1::array来保证索引为零的元素对齐吗? 最佳答案 tr1::array(以及std::array和boost::array)都是POD,所以内容占用的内存与数组的内存重合。因此,根据需要分配array,并使用new位置构造它。typedefstd::tr1::arrayAryT;void*array_storage=aligned_allocation(size

c++ - 使用 STL map 搜索位于矩形区域中的点?

我有很多x,y点,每个x,y点都有一些与之相关的额外数据。我将把这些额外数据存储在一个结构中。我的应用程序要求给定任何一个点,我必须找出在该点周围的矩形区域内还有多少其他点(该点位于矩形的中心)。我想到的一个逻辑是将所有x点存储为mapA中的键,将所有y点存储为另一个mapB中的键。映射A将x作为键,y值作为值。MapB将以y作为键,将关联的结构作为值。这样,如果给定的点是(10.5,20.6),我可以使用upper_bound(10.5+RECTANGLE_WIDTH)和lower_bound(10.5-RECTANGLE_WIDTH)找到位于矩形内的x值范围以及对应的y值,找出y值

c++ - STL 算法和迭代器代替 "for"循环

我想应该有某种方法可以在不使用“for”循环而只使用STL算法和迭代器的情况下编写下面的代码。如果我没记错,谁能指导我如何做到这一点?std::vectorA(N);std::vectorB(N);std::vectorC(N);std::vectorD(N);for(inti=0;i 最佳答案 typedefboost::counting_iteratorcounter;std::transform(counter(0),counter(N),A.begin(),myFunction1);std::transform(A.begi

c++ - 访问迭代器指向的列表元素

自然的答案是取消对迭代器的引用并获取值。但是,我坚持使用VC++2010,它不允许取消引用列表迭代器(或者是吗?)我很困惑,因为有一次,我需要取消引用两个列表迭代器并使用以下方法比较它们的值:(*它)==(*它2)该程序因错误而崩溃,仅由于这一行。我也在声明中取消引用迭代器:printf("%d\n",(*it));不过,这工作得很好。那么,有没有什么方法可以在不取消引用或不使用cliext::list的情况下访问元素。for(it=sList.begin();it!=sList.end();it++){for(it2=it;it2!=sList.end();it2++){it2++;

c++ - 在没有new的情况下在堆上创建一个对象

在C++中,是否可以在不使用new或malloc的情况下在堆上创建对象?我认为如果我使用像vector这样的STL容器,它将被放在堆上。如果我这样做:vectorlistObjs=vector();Objectx=Object(...);...listObjs.push_back(x);此处创建的对象位于何处? 最佳答案 x表示的对象驻留在堆栈中。vector::push_back会将其复制到堆中。allocatorvector中的对象可能会使用new或malloc来实现,尽管它可能使用另一个低级API。例如,Unix和Window

c++ - 使用 STL 容器查找序列的 k 个最大元素的最快算法是什么

我需要使用c++任何STL容器找到序列的k最大元素的最快算法。我的想法:使用列表或vector,对它们进行排序,获取前k个元素。在这种情况下,操作数等于n*log(n)。n-元素数。但我认为这不是最好的。 最佳答案 使用std::partial_sort的方法可能是最好的答案。另请注意std::nth_element,只是获取第n个位置右侧的元素(并将序列划分为“更小的”'在第n个元素之前和之后'更大'因此,如果您真的对前k个元素感兴趣(没有特定的内部顺序),那么nth_element绝对需要cookies

c++ - SFINAE 未检测到 T::reference

std::vectorclass是STLContainer概念的模型,因此vector的任何正确实现都必须包含嵌套的typedefvalue_type以及reference.这应该可以使用SFINAE检测到。但是,在我自己的测试中,我可以使用SFINAE来检测嵌套的value_typetypedef,但出于某种原因,我无法检测到reference.templatetypenameT::value_type*test(T){coutvoidtest(...){cout());}输出:Hasnestedtypedef!但是,如果我替换value_type与reference,比如:temp

c++ - 通过 STL 或 Boost 引入虚拟参数

假设有人想用随机数填充一个vector。则有如下明显的解决方案:vectorresult;result.resize(n);for(inti=0;i好的,它显然有效,但我想了解摆脱for循环的最简单的STL/Boost方法是什么。使用std::transform很诱人,但它需要一个带有一个参数的函数。有什么好的STL方法可以在函数中引入伪参数吗? 最佳答案 C++标准库有std::generate()和std::generate_n();例如:#include#include#include#include#includeintge

C++——如何从 STL 容器中有效地删除具有这种条件的元素?

给定以下代码,structStudent{intscore;}queuestdQueue;如果学生的分数低于前一个学生,我想从列表中删除学生。如何高效地做到这一点?例如S1(100)获取S1(100) 最佳答案 您可以编写自定义谓词并使用remove_if。谓词可以是一个仿函数,它总是存储前一个Student的score。像这样:classScoreLessThanPrevious{public:ScoreLessThanPrevious():isFirst(true),previousScore(0){}booloperator(