c++中string.size()的类型是什么?

What is the type of string.size() in C++?

本文关键字:类型 是什么 string size c++      更新时间:2023-10-16

我有以下代码:

#include<iostream>
#include<string>   
int main()
    {
        std::string s = "458";
        std::cout <<s.size()-4;
    }

当我运行这个时,我得到42944935或类似的东西。但是当我用以下修改运行它时:

int main()
{
    std::string s = "458";
    int i = s.size();
    std::cout << i -4;
}

我得到-1,这是我在第一个代码中所期望的。有人能解释一下这里发生了什么吗?

由于历史原因,std::string::size()的返回类型是size_t,这是一个unsigned类型,足以满足最大可能的数组大小。

你可以通过定义一些通用的大小/长度函数来解决这个问题,比如
using Size = ptrdiff_t;  // signed type
template< class Collection >
constexpr auto n_items( Collection const& c )
    -> Size
{ return c.size(); }
// Raw array. Using size_t template param for g++ compatibility.
template< class Item, size_t n >
constexpr auto n_items( Item (&)[n] )
    -> Size
{ return n; }

这里我使用了n_items这个名字,因为c++ 17将定义一个通用的size函数,不幸的是,它返回size_t(并且混淆了一些大小的概念,也很不幸)。这里不希望出现名称冲突。


如果没有这样的函数可用,则可以将大小表示为std::endstd::begin的差值,例如end(s) - begin(s)。原始指针的差异类型是ptrdiff_t(有符号),而像std::string::begin()这样的迭代器的默认差异类型也是ptrdiff_t,来自std::iterator_traits

这是因为size()函数的返回值是一个无符号值。
当从返回值中减去-4时,结果变为负值。您需要告诉cout将值解释为带符号的值(例如,像std::cout <<int(s.size()-4);或您所说的int i = s.size();那样转换值),然后您将得到您所期望的。你得到的这个大整数背后的原因是,如果你把 2的补负值的二进制表示解释为正值,它将是一个非常大的整数值。
要了解更多关于 2的补码二进制算法,您可以参考此链接。