- 浏览: 794181 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
string::size_type类型
从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数。但事实上,size操作返回的是string::size_type类型的值。我们需要对这种类型做一些解释。
string类类型和许多其他库类型都定义了一些伙伴类型(companion types)。这些伙伴类型使得库类型的使用是机器无关的(machine-independent)。size_type就是这些伙伴类型中的一种。它定义为与unsigned型(unsigned int或unsigned long)具有相同的含义,而且可以保证足够大可存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须加上作用域操作符来说明所使用的size_type类型是由string类定义的。
任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。
虽然我们不知道string::size_type的确切类型,但可以知道它是unsigned型(2.1.1节)。对于任意一种给定的数据类型,它的unsigned型所能表示的最大正数值比对应的signed要大一倍。这个事实表明size_type存储的string长度是int所能存储的两倍。
使用int变量的另一个问题是,有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就会超过这个数字。因此,为了避免溢出,保存一个string对象size的最安全的方法就是使用标准库类型string:: size_type。
--------------------------------------------------------------------------------------------------------
所有的查找函数都返回一个size_type类型,这个返回值一般都是所找到字符串的位置,如果没有找到,则返回string::npos 。有一点需要特 别注意,所有和string::npos的比较一定要用string::size_type来使用,不要直接使用int 或者unsigned int等类型。
--------------------------------------------------------------------------------------------------------
问题起源于这样一段代码:
01
#include <algorithm>
02
#include <stdio.h>
03
04
int
main()
05
{
06
size_t indexs = -1;
07
size_t ps = 100;
08
int
index = -1;
09
int
p = 100;
10
printf("%d\n",std::min(p,index));
11
printf("%d\n",std::min(ps,indexs));
12
return
0;
13
}
其实是很简单的题目,不过要对size_t类型有一个了解才行。
关于size_t的来源 :
数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏 BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必须和int一致,因为这是BSD套接字接口标准.最终 POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t".Linux Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。
size_t在C语言中就有了,size_t和ssize_t是ANSI C提供的标准头文件里定义的一个"数据类型",其实并不是新的数据类型,不是关键字,是通过typedef从已有数据类型定义而来。
ANSI C总共提供了24个头文件。
<cstddef>里这么定义了
#include <stddef.h>
using ::size_t
using::ptrdiff_t
在/usr/lib/gcc/i486-linux -gnu/4.4/include下面
<stddef.h>里面我找到了这么几句:
#ifndef __SIZE_TYPE__
#define __SIZE__TYPE__ long unsigned int
#endif
#if !(defined(__GUNU__) && defined (size_t))
typedef __SIZE_TYPE__ size_t;
#ifdef __BEOS
typedef long ssize_t
…
没太看明白,不过从网上找到了不错的一个解释 :
size_t是为了方便系统之间的移植而定义的。
在32位系统上定义为 unsigned int
在64位系统上定义为 unsigned long
更准确的说法是在32位系统上是32位无符号整型
在64位系统上是64位无符号整型
size_t一般用来表示一种计数,比如有多少东西被拷贝等。
sizeof操作符的结果类型是size_t,
该类型保证能容纳实现所建立的最大对象的字节大小。
它的意义大致是"适于计量内存中可容纳的数据项目的个数的无符号整数类型"。
所以,它在数组下标和内存管理函数之类的地方广泛使用
ssize_t:
这个数据类型用来表示可以被执行读写操作的数据块的大小。它和size_t类似,但必须是signed。
再来看下size_t与size_type的区别 :
我觉得有一句话总结的很好:
size_t是全局的,而size_type是跟容器相关的。
找了下相关的文件:
/c++ /4.3/bits/stl_tree.h,stl_list.h,stl_deque.h等直接这么定义了
typedef size_t size_type
stl_mutiset.h则这么定义的:
typedef typename _Rep_type::size_type size_type;
那么size_type到底是一种什么样的类型呢?
string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。
size_type被定义为与unsigned型(unsigned int, unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为而来使用由string类型定义的size_type类型。程序员 必须加上作用于操作符来说明所使用的size_type类型是由string类定义的。
我们为什么不适用int变量来保存string的size呢?
使用int变量的问题是:有些机器上的int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器 上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就能超过这个数字,因此,为了避免溢 出,保存一个string对象的size的最安全的方法就是使用标准库类型 string::size_type ().
一点注意 :虽然是在学习标准库string的时候巧遇了size_type类型,但是,其实vector库也可以定义size_type类型,在vector库中还有一个difference_type类型,该类型用来存储任何两个迭代器对象间的距离,所以是signed类型的。
啰啰嗦嗦说了这么多,其实关于这个问题文章里红字标注的部分就足够了。其他的看下加深印象即可,最开始的程序结果输出为:
-1 100。
发表评论
-
c++ cin输入int的用法
2014-06-10 11:17 1353int icin = 0; for(int i =0; ... -
Linux下case报错syntax error near unexpected token `in
2014-05-20 16:16 1105来分享一个在Linux下执 ... -
查看linux某目录下所有普通文件,不含目录
2014-05-14 15:15 0#include <fstream>#i ... -
scp sz
2014-03-31 18:15 0使用的是secureCRT 那么先拷贝到这台服务器上,再下 ... -
Linux可执行文件执行时找不到共享库
2014-03-31 18:09 2261编译程序时使用了如下参数指定了链接库的位置,但是执 ... -
C++ assert机制
2014-03-06 10:21 925C++ assert机制 ASSERT ... -
为什么C++语言中既有指针也有引用
2013-11-19 11:16 0写在前面的话,本文是 ... -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
2013-11-19 10:20 806栈,就是那些由编译器 ... -
堆内存和栈内存
2013-11-19 10:13 0堆内存就是你用new 修饰符创建的内容会在堆内存中开辟一段空 ... -
C++使用CLI连接DB2
2013-11-15 09:31 3374<!--推荐博文--> ... -
使用 C++ 处理 JSON 数据交换格式
2013-09-10 11:10 909一、摘要 JSON 的全称为:JavaScript Obj ... -
C++的Json解析库:jsoncpp和boost (转)
2013-09-10 10:40 6624JSON(JavaScript Object Notatio ... -
C++ JsonCpp 使用(转)
2013-09-10 10:21 1778前言 JSON是一个轻量级 ... -
C++中map容器的说明和使用技巧(转)
2013-08-22 15:01 1031C++中map容器提供一个键值对容器,map与multim ... -
C++中各种类型的成员变量的初始化方法(转)
2013-08-01 15:26 1018c++各种不同类型成员根据是否static 、时候con ... -
Xerces浅析
2013-07-30 14:15 3139本篇文章主要讲述项目 ... -
Xerces C++ 学习笔记 (转)
2013-07-24 17:04 13191. 初始化平台: XMLPlatformUtils: ... -
Boost智能指针——shared_ptr (转)
2013-07-16 17:27 1783boost::scoped_ptr虽然简单易用,但它不能共享 ... -
GDB调试精粹及使用实例 (转)
2013-07-16 16:21 1071一:列文件清单1. List( ... -
Xerces-C++学习之——查询修改XML文档 (转)
2013-07-16 16:02 3343/** ========================== ...
相关推荐
- `int compare(size_type p0, size_type n0, const string &str, size_type pos, size_type n);` - `int compare(const char *s) const;` - `int compare(size_type p0, size_type n0, const char *s) const;` ...
注意,`index`应为`string::size_type`类型,避免类型不匹配导致的错误。 2. **npos常量**: - `static const size_type npos = -1;`:表示未找到或无效的位置,它被转换为`size_type`的最大值,因为`size_type`...
在`_string_io.h`中,可能会看到如`size_t`这样的类型定义,这是`size_type`在标准库中的常见别名。此外,可能会有像`strlen()`、`strcpy()`、`strcat()`、`strncpy()`等字符串处理函数的声明,这些函数都会用到无...
basic_string(const basic_string, T, A>& rhs, size_type pos, size_type n, const A& al = A()); basic_string(const E* s, size_type n, const A& al = A()); basic_string(const E* s, const A& al = A()); ...
在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...
std::string::size_type sz; // alias of size_t int i_dec = std::stoi(str_dec, &sz); int i_hex = std::stoi(str_hex, nullptr, 16); int i_bin = std::stoi(str_bin, nullptr, 2); int i_auto = std::stoi...
- `size_type`是`std::string`中用于表示字符串长度的无符号整型类型,可以使用`string::size_type`来声明变量。 4. **string类的构造函数**: - `string(const char *s)`:初始化为C风格字符串,即以空字符结尾...
- `int compare(size_type index, size_type length, const basic_string &str, size_type index2, size_type length2);`:与 `str` 的子串进行比较,子串从 `index2` 开始且长度为 `length2`。 #### 删除 (Erase)...
lw->WriteLine("类型是:String 名称:"+array_nxstr[i]); else if(type==1) lw->WriteLine("类型是:Double 名称:"+array_nxstr[i]); else if(type==2) lw->WriteLine("类型是:Logical 名称:"+array_nxstr...
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* userp) { userp->append((char*)contents, size * nmemb); return size * nmemb; } int main() { CURL* curl = curl_easy_init...
<string-array translatable="false" name="config_tether_bluetooth_regexs"> <item>"bt-pan" </string-array> 3、 Q:\a33\ap6212a0_a33_sc3817r\android\device\softwinner\astar-y3\astar_y3.mk # ap6181/...
- `replace(size_type pos, size_type len, const string& str)`: 从位置`pos`开始,将长度为`len`的子串替换为`str`。 - `erase(size_type pos = 0, size_type len = npos)`: 从位置`pos`开始,删除长度为`len`的...
basic_string& insert (size_type pos, const basic_string& str, size_type pos1, size_type n); str从下标为pos1开始数的n个字符插在原串下标为pos的字符前 basic_string& insert (size_type pos, size_typ
- **格式**:RESUMABLE_NAME=text_string_used_to_identify_resumable_statement ##### RESUMABLE_TIMEOUT - **描述**:等待可恢复操作的时间。 - **格式**:RESUMABLE_TIMEOUT=wait_time_for_RESUMABLE ##### TTS...
- **语法:** `string substr(size_t pos, size_t len) const;` - **示例:** `std::string s = "Hello World"; std::string sub = s.substr(6, 5);` 32. **`swap`**: 交换两个字符串的内容。 - **语法:** `...
* ip_type:网络类型,int类型,取值包括WIFI、CELLULAR_UNKNOWN、CELLULAR_2G、CELLULAR_3G、CELLULAR_4G等 * cellular_operator:运营商ID,uint32类型 * nopcellular_id:运营商ID,string类型 * wifi_ssid:WIFI...
width can only overflow size_type if sizeof(streamsize) > sizeof(size_type) because here we know that __width is positive and the stattic assertion check that size_type is unsigned.
ai_type: Integer; ai_drverversion: DWORD; ai_flags: DWORD; ai_physaddr: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of Byte; ai_len: ULONG; ai_description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH...
std::string::size_type len = encoded_string.size(); const std::string::size_type padding = len % 4; if (padding) { throw std::invalid_argument("Invalid Base64 input: incorrect padding"); } ...
return yolo::load(model_path_seg, yolo::Type::V8Seg);} ,max_batch_size ); ~~~ 创建流水线中的异步执行节点 ~~~c++ // ffmpeg解码节点 auto ffmpeg_input_node = FFmpeg::create_ffmpeg("ffmpeg_input_node...