Python与C++语法比较--字符串篇

news2024/11/20 12:27:31

tags: C++ Python

写在前面

刷lc从Python转向C++, 不只是语法层面, 还要改变很多的API, 这次记录一下C++和Python在字符串方面的一些区别, 供参考.

基本区别

Python字符串是不可变类型, 而C++的String为容器(本质上是一个类的别名, 说容器有点不合适, 因为容器内的元素类型已经被指定为char), 可变类型.

C++

先说一下字符, 是指char类型, 其本质上也是int类型(0~127的ASCII字符, 存在隐式类型转换)

using string = std::basic_string<char>;  // string其实是一个类型别名

如果不需要一般的字符串操作, 可以使用vector<char>, 是一种比较纯粹的字符数组类型, 资源占用较少. 并且C++17新增了一种叫做string_view的类型, 用起来比string轻量, 下面是罗剑锋老师给出的描述.

string它确实有点“重”,大字符串的拷贝、修改代价很高,所以我们通常都尽量用 const string&,但有的时候还是无法避免(比如使用 C 字符串、获取子串)。如果你对此很在意,就有必要找一个“轻量级”的替代品。

在 C++17 里,就有这么一个完美满足所有需求的东西,叫 string_view。顾名思义,它是一个字符串的视图,成本很低,内部只保存一个指针和长度,无论是拷贝,还是修改,都非常廉价。

Python

字符串是不可变类型, 并且转换成ASCII码的话需要额外的内置函数:

chr(97) # 'a'
ord('a') # 97

字符串创建

Python

s1='1'
s2='abc'
s3="45"
s4=r"D:\Desktop"

单双引号都可以, 并且支持原生(raw)字符串.

小坑:

原生字符串不支持单字符, 即s=r'\'这样的写法是会报错的, 只能老老实实转义:s='\\.

C++

string s1="123";
// string s2='1';// error
string s3{"abc"}; //initializer_list, C++11

单引号和双引号并不能混用, 需要注意单引号只能表示单一字符, char类型, 而双引号表示字符串类型(char*), 除非使用string以及相关构造函数, 否则默认的类型为const char*, 例如:

void t1() {
    auto s1 = "abc";
    cout << typeid(s1).name() << endl; // PKc

    auto s2 = "bcd"s; // 字符串字面量C++14
    cout << typeid(s2).name() << endl;
    string s3 = "bcd";
    cout << typeid(s3).name() << endl;
    /*NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
    NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE*/
}

并且C风格的字符串中双引号之间可以合并的语法也被C++的string延续了下来.

void t2() {
    string s1 =
        "abc"
        "ac";
    cout << s1 << endl;
    /* string s2 = 'a' 'b'; // error */
}

主要操作

操作Python方法C++方法
s1中查找s2s1.find(s2),
找到返回索引, 否则返回-1
s1.find(s2), 找到返回索引,
否则返回string::npos
取子串[1,5]s[1:6], 左闭右开区间取值s.substr(1, 5)表示从索引1开始取,
取包括1在内的5个字符
连接字符串
s1s2
加号或者+=连接加号或者+=连接
字符串比较字典序比较, 使用比较运算符字典序比较, 使用比较运算符

检查字符

条件
Python
(成员函数,可针对字符串)
C++
(全局函数,只针对字符)
是否为数字s.isdigit()isdigit(c)
是否为字母s.isalpha()isalpha(c)
是否为小写字母s.islower()islower(c)
是否为大写字母s.isupper()isupper(c)
是否为字母或数字s.isalnum()isalnum(c)
是否为十六进制字符(0~F)-isxdigit(c)

转换字符大小写:

转换方向Python(成员函数)C++(全局函数)
大写->小写s.lower()static_cast<char>(tolower(c))
小写->大写s.upper()static_cast<char>(toupper(c))

C++

#include <cctype>

void t1() {
    char c1 = 'a';
    cout << islower(c1) << endl; // 1
    char c2 = 'N';
    cout << isupper(c2) << endl; // 1
    char c3 = '0';
    cout << isnumber(c3) << endl; // 1
    char c4 = '0';
    cout << isalnum(c4) << endl; // 1
    char c5 = 'g';
    cout << isxdigit(c5) << endl; // 0
}

void t2() {
    char c1 = 'a';
    /* cout << (char)toupper(c1) << endl; // A */
    cout << static_cast<char>(toupper(c1)) << endl; // A
    char c2 = 'A';
    cout << (char)tolower(c2) << endl; // a
}

格式化输出

这部分不是严格的字符串方面, 但是也有值得对比的点.

C++当然要用最具C++味道的cout了(虽然名声不好, 但是在泛型方面的支持还是比printf()方便不少, 注意一下别和左移运算符用混了就行), 而Python就是一个printf()吃遍天.

输出的内容PythonC++
字符串print(s)cout<<s<<endl;
二进制整数(字符串形式输出)print(bin(x))cout<<bitset<>
八进制整数print(oct(x))cout<<oct<<x<<endl;
十六进制整数(地址值)print(hex(x))cout<<hex<<x<<endl;
整数格式化(指定对齐方式和位数)Python3.6支持的f-string
print(f"{123:0<6}")
cout << setfill('0')
<< setw(6) << left
<< 123 << endl;
浮点数格式化输出(指定小数点后4位)print(f"{1.2:.4f}")cout << fixed
<< setprecision(4)
<< 3.14159 << endl;

参考:
Formatting Output in C++ (niu.edu);

C++

两种方法.

#include<sstream>
// 使用字符流. (可以定制)
void t3() {
    /* basic_ostringstream<char> oss; */
    ostringstream oss;
    // 默认是right
    oss << setfill('0') << setw(5) << left << 123;
    cout << oss.str() << endl;
    // 可定制
    cout << oss.str().insert(3, "-").insert(5, "-") << endl;
    /* 12300 */
    /* 123-0-0 */
}
// 直接输出
void t4() {
    // 默认是right
    cout << setfill('0') << setw(5) << left << 123 << endl;
    /* 12300 */
}
// 浮点数
void t5() {
    cout << setprecision(3) << 3.14159 << endl; // 3.14,总位数
    cout << fixed << setprecision(3) << 3.14159 << endl; // 3.142,小数点后位数,支持四舍五入
}

Python

print(f"{123:0<6}") # 123000
print(f"{1.23456:.4f}") # 支持四舍五入, 1.2346

字符流刷新

这算是一个比较小的主题, 但是也很常用. 一个比较常见的例子就是终端命令行程序中的进度条旋转, 使用字符流的输出刷新flush就可以完成.

下面是Python和C++的实现方式, 需要知道的另外一个点就是\r表示光标移动到开头, 这同时也是进度条旋转的关键.

from time import sleep

str_lst = ["-", "\\", "|", "/", "-"]

for i in range(100):
    sleep(0.5)
    print(f"{str_lst[i%4]} process: {i}%\r", flush=True, end="")
aa

下面是C++版本的:

#include <unistd.h>
#include <string>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
    string str{R"(-\|/-)"s};
    int n{100};
    while (n--) {
        usleep(200 * 1000); // 微秒
        cout << str[n % 4] << " process:" << 100 - n << "%\r" << flush;
    }
    return 0;
}
aa

类型转换

转换方向Python函数C++函数
字符串->整数int(),
支持不同数制(base参数)
stoi(), stol(), stoll()
字符串->浮点数eval()stof(), stod()
浮点数/整数->字符串str()to_string()

Python的字符串转换还是相当方便的, 并且支持浮点数

Python

int('1011', base=2) # 11

C++

void t1() {
    auto a = "123"s;
    auto b = "12.3"s;
    cout << stoi(a) << endl;
    cout << stod(b) << endl;
    /* 123 */
    /* 12.3 */
}

小结

暂时先总结这么多, 之后刷题遇到再说.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin中的Lambda编程

文章目录1.集合的创建与遍历2.集合的函数式API3.Java函数式API的使用1.集合的创建与遍历 传统意义上的集合主要是List和Set&#xff0c;再广泛一点的话&#xff0c;像Map这样的键值对数据结构也可以包含进来。List&#xff0c;Set和Map再Java中都是接口&#xff0c;List主要的…

Java设计模式-命令模式Command

介绍 命令模式&#xff08;Command Pattern&#xff09;&#xff1a;在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收 者是谁&#xff0c;也不知道被请求的操作是哪个&#xff0c; 我们只需在程序运行时指定具体的请求接收者即可&…

数影周报:TikTok因在线跟踪被罚500万欧,Windows 7退出历史舞台

本周看点&#xff1a;TikTok因在线跟踪被法国罚款500万欧元 &#xff1b;思科已裁员近700 人&#xff1b;Windows 7退出历史舞台&#xff1b;亚马逊向所有卖家开放Buy with Prime服务&#xff1b;“全路程”完成2亿元C轮融资......数据安全那些事TikTok因在线跟踪被法国罚款500…

Android13 wifi无线调试adb连接设置

在进行adb调试的时候&#xff0c;有时候需要使用wifi连接&#xff0c;或者wifi连接较为方便&#xff0c;早些的Android上&#xff0c;需要设置端口等操作&#xff0c;adb tcpip 6666参考android wifi adb 调试 - 简书 (jianshu.com)好几步操作&#xff0c;在Android13上&#x…

Deque 的理解 STL中stack与queue为什么选择使用deque为底层模板容器

目录 一、Deque的引入 二、Deque是什么&#xff1f; 三、deque的遍历方式&#xff1f;deque的缺陷&#xff1f; 四、它为什么能更贴合与stack与queue&#xff1f; 五、STL中vector与list的底层实现 一、Deque的引入 Stack、Queue在之前的博客中我也是分别使用了更容易处理…

【蓝桥杯】历届真题 杨辉三角形 (省赛)Java

【问题描述】 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列: 1,1&#xff0c;1&#xff0c;1&#xff0c;2,1&#xff0c;1&#xff0c;3,3&#xff0c;1&#xff0c;1,4&#xff0c;6,4&#xff0c;1&…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (六)多功能数据处理器

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;六&#xff09;多功能数据处理器 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a;牛客…

react基础Day02-受控组件评论案例propscontext

React组件 目标 能够知道受控组件是什么能够写出受控组件了解非受控组件 表单处理 受控组件&#xff08;★★★&#xff09; HTML中的表单元素是可输入的&#xff0c;也就是有自己的可变状态而React中可变状态通常保存在state中&#xff0c;并且只能通过setState() 方法来…

[acwing周赛复盘] 第 86 场周赛20230114

[acwing周赛复盘] 第 86 场周赛20230114 一、本周周赛总结二、 4794. 健身1. 题目描述2. 思路分析3. 代码实现三、4795. 安全区域1. 题目描述2. 思路分析3. 代码实现四、4796. 删除序列1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 去吃羊蝎子了&#xff0…

基于汽车知识图谱的汽车问答多轮对话系统 详细教程

结果: 1 技术路线 该技术路线主要将KBQA分为三部分,实体识别与实体链接,关系识别,sparql查询,其中每个部分分为一到多种方法实现。具体的处理流程图如下:

大脑的记忆

AI神经网络中的记忆 当前AI发展进入一个瓶颈,大家都意识到还是要继续在人脑中获取AI方向的指引。当然也有科学家说物理世界与心理世界并非一一对应,人类的智能也没必要与物理世界一一对应,甚至本质上都可以是不同的,所以没必要研究大脑认知和大脑的机制,更不需要分子级别…

IDEA structure窗口各标志及功能

文章目录图标对象类型访问权限其他修饰符工具栏图标 对象类型 class 类 interface 接口 enum 枚举 interface 注解 class initializer 代码块 method 方法 field 字段/属性 anonymous class 匿名类 lambda lambda表达式 propertie 访问器&#xff08;get方法&#xff0…

【Java面试】Queue接口

文章目录BlockingQueue中有哪些方法&#xff0c;为什么这样设计&#xff1f;BlockingQueue是怎么实现的&#xff1f;BlockingQueue中有哪些方法&#xff0c;为什么这样设计&#xff1f; 先看一眼结构&#xff0c;再看具体的分析 为了应对不同的业务场景&#xff0c;Blockin…

拉伯证券|业绩猛增超13倍,主力连续抢筹,这只股收获4连板

成绩陡增股获主力接连抢筹 春节日益接近&#xff0c;A股成交活跃度有所下滑&#xff0c;不过有一些股票节前继续取得主力喜爱。证券时报•数据宝核算&#xff0c;到1月12日收盘&#xff0c;沪深两市共54只个股接连5日或5日以上主力资金净流入。 主力资金净流入继续周期最长的是…

人工智能学习07--pytorch03--tensorboard(下载tensorboard、opencv)

transform 主要是对input图像进行变换&#xff08;统一尺寸、对图像中的数据进行类的转换&#xff09; TensorBoard很有用 如&#xff1a;通过loss的变化过程&#xff0c;来看loss的变化是否复合预想。也可以通过loss来选择模型。 TensorBoard&#xff0c;虽然他是TensorFlo…

排序综合(C++版)

目录 排序综合 一、问题描述 二、运行环境说明 三、代码段 四、效果展示 排序综合 备注&#xff1a;大二&#xff08;上&#xff09;数据结构课程设计B题 一、问题描述 给定N…

Python asyncio异步编程简单实现

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容是Python asyncio异步编程简单实现。 一、asyncio事件循环简介 asyncio引入了事件循环的概念。事件循环是一个死循环&#xff0c;还循环会检测并执行某些代码。在Python中&#xff0c;引入了asyncio模块后&#xff…

动态内存管理:学习笔记9

目录 一.前言 二.动态内存函数 1.malloc和free 2.calloc函数 3. realloc函数(动态内存空间调整函数) 情形一&#xff1a;扩容时&#xff0c;原内存地址处可以容纳调整后的动态内存 情形二&#xff1a;扩容时&#xff0c;原内存地址无法容纳调整后的动态内存 三.C/C程序…

MATLAB实现费诺编码的计算与分析

一、实验目的 1、理解霍费诺编码的原理。 2、掌握费诺编码的方法和步骤。 3、熟悉费诺编码的效率。 4、本实验用Matlab语言编程实现费诺&#xff08;Fano&#xff09;编码。 二、实验环境 windows XP&#xff0c;MATLAB 7 三、实验原理 费诺编码算法如下&#xff1a;在信源…

构建前端项目

1.使用vite构建vue项目 vite构建vue项目&#xff0c;输入以下命令&#xff1a; npm init vitelatest接着按照提示的命令选择项目的名称、框架、语言。接着项目就构建完成了。 接着将构建好的项目&#xff1a;vite-demo拖入vsCode里面&#xff0c;在package.json中可以看到项…