我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.
我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:
CHAR_BIT != 8signed 不是两个补充(我听说Java有这个问题).我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型†.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.
所以问题是:哪些架构具有上述属性?
† uint*_ts是可选的.
标准C++中有算法std::count/ std::count_if.
template<class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& value);
template<class InputIterator, class Predicate>
typename iterator_traits<InputIterator>::difference_type
count_if(InputIterator first, InputIterator last, Predicate pred);
Run Code Online (Sandbox Code Playgroud)
效果:返回以下相应条件所适用的[first,last]范围内的迭代器数量:*i == value,pred(*i)!= false.
difference_type是iterator's difference_type,可以是负数,但count只能返回值> = 0.为什么difference_type而不是size_t例如?
刚刚意识到std::count_if 返回一个有符号的值.
为什么这样设计?在我看来,这两者都没有意义(结果只能是一个自然数,即非负整数),因为它不允许做一些简单的事情,比如将这个结果与容器进行比较size()而不会得到警告或使用显式类型转换.
我真的认为返回类型应该有size_type.
我错过了什么吗?
该文档说,size_type的std::vector是/ usually / size_t,这是合理的,因为实现可以选择使用不同的东西。
但是为什么size_type = size_t在std::array。特别是在这里,因为std::array使用很少µC,所以最好使实现具有一定的自由度。
这是文档缺陷吗?
我真的很惊讶地看到它std::count返回了一个iterator_traits<InputIterator>::difference_type,这反过来指的long int是我的平台上的一个.
这是为什么?容器中的负计数元素没有任何意义.
c++ ×5
architecture ×1
c ×1
c++11 ×1
containers ×1
size-t ×1
stdarray ×1
stdvector ×1
stl ×1
types ×1