草庐IT

c++ - 使用 memoized 函数观察到奇怪的性能

我正在研究使用欧几里德算法计算两个数的GCD的东西。我像往常一样实现了标准的单线,并且效果很好。它用于计算系列并调用gcd()的算法中每个元素多次,如n变大。我决定看看我是否可以通过内存来做得更好,所以这是我尝试过的:size_tconstgcd(size_tconsta,size_tconstb){returnb==0?a:gcd(b,a%b);}structmemoized_gcd:privatestd::unordered_map{size_tconstoperator()(size_tconsta,size_tconstb){unsignedlonglongconstkey=(

c++ - std::string::max_size() 作为静态成员

为什么max_size不是std::string的静态成员?这可以编译,但我觉得奇怪的是所有字符串共有的属性只能通过字符串的实例访问:std::size_tmax_size=std::string().max_size();为什么会这样实现? 最佳答案 Whyisn'tmax_sizeastaticmemberofstd::string?因为max_size返回值取决于字符串实例内部使用的分配器实例。 关于c++-std::string::max_size()作为静态成员,我们在Stac

c++ - 对于具有默认分配器的标准容器,std::container::size_type 是否保证为 size_t?

喜欢:std::string::size_typestd::list::size_typestd::map::size_typestd::vector::size_type等等两者都是cplusplus.com和cppreference.com说他们通常是size_t,但它们是否真正、明确地保证为size_t的标准除非使用自定义分配器? 最佳答案 对于STL容器-不。[container.requirements.general]中标准的表96,其中列出了任何容器的容器要求X,解释得很清楚:但是,对于basic_string,siz

c++ - std::vector::resize(size_type) 需要 CopyInsertable?

这个问题是在我回答thisanotherquestion的时候提出的.N333723.3.6.3“vector容量”说(在770页):voidresize(size_typesz);Effects:Ifsz,equivalenttoerase(begin()+sz,end());.Ifsize(),appendssz-size()value-initializedelementstothesequence.Requires:TshallbeCopyInsertableinto*this.然而,clang++saysit'sokaythoughTisnotcopyable.我认为resiz

c++ - 制作 std::vector capacity>=N 和 size=0 的最佳方法?

给定一个std::vector,其大小和容量可以是任意的,将其大小更改为0并将容量更改为至少N(给定数字)的最佳做法是什么?我的直接想法是:voidf(vector&t,intN){t.clear();t.reserve(N);}但是我注意到了Areallocationisnotguaranteedtohappen,andthevectorcapacityisnotguaranteedtochange(whenstd::vector::cleariscalled).所以我想知道当原始容量大于给定的N时如何避免重新分配? 最佳答案 w

c++ - 不使用 odr 的数组计数?

有几个很好的理由去选择#includetemplateconstexprstd::size_tARRAY_COUNT_FUNC(T(&arr)[N]){returnN;}而不是#defineARRAY_COUNT_MACRO(arr)(sizeof(arr)/sizeof(*arr))一个重要的区别是,当一个指针(不是数组)被传递给ARRAY_COUNT_MACRO时,它会默默地返回一个无用的答案,但是将相同的参数传递给ARRAY_COUNT_FUNC会导致编译错误指出错误。但是宏确实有一个优点:它的参数是未计算的。#includestructS{intmember_array[5];

c++ - binary_search 与 std::pair 使用自定义运算符

我正在尝试进行binary_search,包括一个整数对vector和一个整数,如下所示:#include#includeusingnamespacestd;typedefvector>int_pairs;booloperator&r){returnr.first(1,2));pairs_vec.push_back(pair(2,2));size_ti(2);binary_search(pairs_vec.begin(),pairs_vec.end(),i);}编译器告诉我operator未定义:erreur:nomatchfor‘operator’)我的做法是否正确?我尝试以多种不同

c++ - 为什么 GCC 中 std::list O(n) 的 size() 方法?

在GCC中,std::list的size()方法是O(n)。为什么?对于C++11,标准是size()oflistshouldbeO(1)但是在glibc中我们有以下内容:/usr/include/c++/4.6.3/bits/stl_list.htemplate>classlist:protected_List_base{...size_typesize()const{returnstd::distance(begin(),end());}问题是:为什么三年前的要求还没有在GCC中实现?编辑:gcc5改变了这一点:尽管以ABI改变为代价;这意味着使用gcc5.0编译的C++代码将无法

具有非 size_t 整数的 std::array 的 C++ 模板参数推导

我正在尝试调整Avoidingstructinvariadictemplatefunction中提供的解决方案根据我的需要。但是,我无法理解G++的行为。考虑以下功能:templateintnextline(consttypenamestd::arrayar){return0;}然后调用nextline(std::array{1,0});与GCC提示不匹配eslong.cpp:Infunction‘intmain()’:eslong.cpp:10:38:error:nomatchingfunctionforcallto‘nextline(std::array)’nextline(std

c++ - 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?

由于std::vector上的大多数操作都需要/返回size_t-这就是我用于索引的类型。但现在我已经启用所有编译器警告来修复一些我知道的有符号/无符号转换问题,这条消息让我感到惊讶:warningC4365:'argument':conversionfrom'size_t'to'__w64int',signed/unsignedmismatch它是由这段代码生成的:std::vectorv;size_tidx=0;v.insert(v.begin()+idx+1,0);我收到很多其他类似的消息,建议迭代器的算术运算符接受并返回int。为什么不是size_t?修复所有这些消息很痛苦,并