【c++】string::size_type

本文介绍了C++中std::string类型的size_type、npos常量以及substr函数的使用。size_type是无符号整型,用于表示string对象的大小,npos表示不存在的位置。substr函数用于提取子字符串,可以从指定位置开始并指定长度。示例代码展示了如何使用这些功能,包括查找子串、截取字符串等操作。

string::size_type

在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据。可以理解为一个与unsigned含义相同,且能足够大能存储任意string的类型。在C++ primer 中 提到 库类型一般定义了一些配套类型,通过配套类型,库类型就能与机器无关。我理解为 机器可以分为16位 32位64位等,如果利用int等内置类型,容易影响最后的结果,过大的数据可能丢失。

string::npos

std::string::npos是一个常数,它等于size_type类型可以表示的最大值,用来表示一个不存在的位置

string.substr()

substr()是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。

std::string str="We think in generalities, but we live in details.";
// (quoting Alfred N. Whitehead)
std::string str2 = str.substr (3,5); // 从第三个字符开始往后数5个--"think"
std::size_t pos = str.find("live"); // position of "live" in str
std::string str3 = str.substr (pos); // get from "live" to the end
std::cout << str2 << ' ' << str3 << '\n';

结果为:

think live in details.

string s="student12";
	string x = s.substr();       //默认时的长度为从开始位置到尾
	string y = s.substr(5);      //获得字符串s中 从第5位开始到尾的字符串
	string z = s.substr(5, 3);    //获得字符串s中 从第5位开始的长度为3的字符串

std::string::find_first_of

size_t find_first_of (const string& str, size_t pos = 0)

find_first_of() 函数用于查找子字符串和字符串共同具有的字符在字符串中首次出现的位置。请看下面的代码:

#include <iostream>
#include <string>
using namespace std;
int main(){
    string s1 = "first second second third";
    string s2 = "asecond";
    int index = s1.find_first_of(s2);
    if(index < s1.length())
        cout<<"Found at index : "<< index <<endl;
    else
        cout<<"Not found"<<endl;
    return 0;
}

运行结果: Found at index : 3

本例中 s1 和 s2 共同具有的字符是 ’s’,该字符在 s1 中首次出现的下标是3,故查找结果返回3。

### `std::string::size_type` 在 C++03 中的定义 在 C++03 标准中,`std::string::size_type` 是一个无符号整型类型,用于表示字符串的大小和索引。它被定义为能够容纳任何字符串对象大小的无符号类型。标准库实现可以选择适合的底层类型,通常为 `unsigned long` 或类似的无符号类型,以确保其足以表示最大可能的字符串长度。 `std::string::size_type` 通常用于返回字符串的 `size()`、`length()`、`max_size()` 等函数返回类型,也用于索引操作(如 `substr()` 和 `find()` 等方法的参数)[^1]。 ### `std::vector::size_type` 的定义及其与 `std::string::size_type` 的比较 `std::vector::size_type` 也是无符号整型类型,用于表示容器中元素的数量和索引。它与 `std::string::size_type` 类似,都是标准库中用于表示容器或字符串大小的标准类型。 在大多数标准库实现中,`std::vector<T>::size_type` 和 `std::string::size_type` 的底层类型是相同的,通常为 `size_t`。然而,C++03 标准并没有强制要求它们必须相同,而是允许每个容器和字符串类独立定义自己的 `size_type`。因此,在某些实现中可能会出现差异,尽管这种差异在实践中非常少见[^1]。 ### 主要异同点总结 - **相同点**: - 两者均为无符号类型。 - 均用于表示容器或字符串的大小和索引。 - 通常底层使用 `size_t` 类型(尽管标准未强制要求)。 - **不同点**: - `std::string::size_type` 专用于字符串类的操作,如 `find()`、`substr()` 等。 - `std::vector::size_type` 用于动态数组容器,适用于 `size()`、`capacity()`、`resize()` 等操作。 - 它们分别定义在不同的类中,即 `std::string` 和 `std::vector<T>`。 例如,以下代码展示了两者在使用上的区别: ```cpp #include <iostream> #include <string> #include <vector> int main() { std::string s = "example"; std::vector<int> v = {1, 2, 3}; std::string::size_type str_size = s.size(); std::vector<int>::size_type vec_size = v.size(); std::cout << "String size: " << str_size << std::endl; std::cout << "Vector size: " << vec_size << std::endl; return 0; } ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值