我有以下代码:
#include<iostream>
#include<string>
int main()
{
std::string s = "458";
std::cout <<s.size()-4;
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到42944935或类似的东西.但是当我通过以下修改运行它时:
int main()
{
std::string s = "458";
int i = s.size();
std::cout << i -4;
}
Run Code Online (Sandbox Code Playgroud)
我得到-1,这是我从第一个代码中得到的.有人能解释一下这里发生了什么吗?
由于历史原因,返回类型为std::string::size()is size_t,这是一个足以满足最大可能数组大小的无符号类型.
你可以通过定义一些通用的大小/长度函数来解决这个问题
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; }
Run Code Online (Sandbox Code Playgroud)
在这里,我使用了这个名称,n_items因为C++ 17将定义一个通用size函数,不幸的是,它返回size_t(并且混合了许多大小的概念,也是不幸的).人们不希望那里发生名称冲突.
当你没有提供这些功能的另一种方法是表达大小的差异std::end和std::begin,如end(s) - begin(s).原始指针的差异类型是ptrdiff_t(已签名),并且您获取的迭代器的默认差异类型std::string::begin()也ptrdiff_t来自std::iterator_traits.