jjzjj

InputIterator

全部标签

c++ - __glibcxx_function_requires 和 __glibcxx_requires_valid_range 宏是如何工作的?

templateinline_Tpaccumulate(_InputIterator__first,_InputIterator__last,_Tp__init,_BinaryOperation__binary_op){//conceptrequirements__glibcxx_function_requires(_InputIteratorConcept)__glibcxx_requires_valid_range(__first,__last);for(;__first!=__last;++__first)__init=__binary_op(__init,*__first);r

c++ - 对 InputIterator 语义/概念要求的混淆

C++InputIterator是迭代器概念中最有限的类型之一。它只保证支持解引用、相等比较、前自增和后自增(以及后自增和解引用)因为InputIterator对象经常迭代任意流,您甚至不能确定对同一输入迭代两次会产生相同的值。不过,我很困惑,如果取消引用运算符operator*每次取消引用时都能保证返回相同的值,前提是您从不递增迭代器。例如,假设std::begin(some_input_stream)返回一个满足InputIterator概念要求的对象,而它不等于到或超过结束位置:autoit=std::begin(some_input_stream);autovalue1=*it

c++ - 显式初始化指针 vector 会导致转换错误?

考虑一下:std::vectorv(1,0);这在VC++10上编译得很好(即使在最大警告级别也没有警告)。但是,它不会在mac上使用llvm编译,也不会在linux上使用gcc编译,会出现类似“assigningtoint*fromincompatibletypeconstint”这样的错误。我不是在寻找解决方案——我知道第二个参数是不必要的,或者static_cast可以修复错误。我认为零可以隐式转换为任何指针类型。是什么赋予了?我可以执行以下操作:int*i=0;int*const&ii=0;constintt=0;i=t;我知道vector构造函数签名采用constT&当扩展为

c++ - 如何实现 std::advance 以更改迭代器类型的行为?

我们对std::advance的了解如下:templatevoidadvance(InputIterator&i,Distancen);目的将迭代器i推进n个元素。如果i是一个随机访问迭代器,函数使用一次operator+或operator-,否则函数重复使用递增或递减运算符(operator++或operator--)直到n个元素被递增。我的问题如下:std::advance是如何实现的,以便识别it是否是随机访问迭代器?它怎么知道它可以使用operator+而不是operator++? 最佳答案 通过iterator_trait

c++ - 如果没有 if,std::count_if 会更快吗?

这是gccstd::count_if代码templatetypenameiterator_traits::difference_typecount_if(_InputIterator__first,_InputIterator__last,_Predicate__pred){[snip]typenameiterator_traits::difference_type__n=0;for(;__first!=__last;++__first)if(__pred(*__first))++__n;return__n;}我的问题:使用它会更好(即更快)吗__n+=__pred(*__first)

c++ - 为什么标准库有find和find_if?

难道find_if不能只是find的重载吗?std::binary_search和friend就是这样做的... 最佳答案 谓词是一个有效的查找对象,因此您可能会产生歧义。考虑将find_if重命名为find,那么你有:templateInputIteratorfind(InputIteratorfirst,InputIteratorlast,constT&value);templateInputIteratorfind(InputIteratorfirst,InputIteratorlast,Predicatepred);然后,应

c++ - 重载模板函数选择(模式匹配)如何在 std::vector 插入中工作?

考虑以下std::vector的声明(取自cplusplus-EASTL具有相同的声明)iteratorinsert(iteratorposition,constT&x);voidinsert(iteratorposition,size_typen,constT&x);templatevoidinsert(iteratorposition,InputIteratorfirst,InputIteratorlast);如果我输入someVector.insert(someVector.begin(),10,90);not是如何(由编译器)与最后一个重载混淆的,其中10和90是ints和In

c++ - 重载模板函数选择(模式匹配)如何在 std::vector 插入中工作?

考虑以下std::vector的声明(取自cplusplus-EASTL具有相同的声明)iteratorinsert(iteratorposition,constT&x);voidinsert(iteratorposition,size_typen,constT&x);templatevoidinsert(iteratorposition,InputIteratorfirst,InputIteratorlast);如果我输入someVector.insert(someVector.begin(),10,90);not是如何(由编译器)与最后一个重载混淆的,其中10和90是ints和In

c++ - 为什么 emplace_back 需要移动构造函数

我有以下代码:#include#include#includeclassTestfinal{public:Test(conststd::string&s):s_(s){std::coutv;v.emplace_back("emplace_back");}当允许移动构造函数时,会发生以下情况:[matttest]g++-std=c++11main.cpp&&./a.outconstructing:emplace_back但是,如果移动构造函数被移除:[matttest]g++-std=c++11main.cpp-DNO_MOVE&&./a.out/usr/lib/gcc/x86_64-r

c++ - 为什么 emplace_back 需要移动构造函数

我有以下代码:#include#include#includeclassTestfinal{public:Test(conststd::string&s):s_(s){std::coutv;v.emplace_back("emplace_back");}当允许移动构造函数时,会发生以下情况:[matttest]g++-std=c++11main.cpp&&./a.outconstructing:emplace_back但是,如果移动构造函数被移除:[matttest]g++-std=c++11main.cpp-DNO_MOVE&&./a.out/usr/lib/gcc/x86_64-r