字符串合并处理:C++ bitset库和stoi()函数实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串合并处理:C++ bitset库和stoi()函数实践相关的知识,希望对你有一定的参考价值。

参考技术A

题目描述
按照指定规则对输入的字符串进行处理。
详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。
对排序后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。
举例: 输入str1为"dec",str2为"fab",合并为“decfab”,分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”
输入描述:输入两个字符串
输出描述:输出转化后的结果
示例:
输入:dec fab
输出:5D37BF

题目本身难度不大,细节处理比较多,合并给定的两个字符串,并按照奇偶位置分别排序,再将排序后的两个奇偶序列重新合并,这部分比较简单,合并的过程中可以按照题意对每个满足要求的字符进行进一步的处理,返回处理的结果加入新的结果字符串。对单个满足要求的字符进行如下处理:

注意细节:

这是不对的,单个字符转string需要指定长度,详情看string类构造函数(6)的形式:

c++知识点

### 1、stoi()函数
stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十进制 示例:stoi(str, 0, 2); //将字符串 str 从 0 位置开始到末尾的 2 进制转换为十进制。stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!
### 2、const
**(1)、const对象默认为文件局部变量**
const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern
未被const修饰的变量在不同文件下的访问
```c++// file1.cppint ext// file2.cpp#include<iostream>/** * by 光城 * compile: g++ -o file file2.cpp file1.cpp * execute: ./file */extern int ext;int main(){ std::cout<<(ext+10)<<std::endl;}```
const常量在不同文件的访问
```c++//extern_file1.cppextern const int ext=12;//extern_file2.cpp#include<iostream>/** * by 光城 * compile: g++ -o file const_file2.cpp const_file1.cpp * execute: ./file */extern const int ext;int main(){ std::cout<<ext<<std::endl;}```
**(2)指针与const**
```const char * a; //指向const对象的指针或者说指向常量的指针。char const * a; //同上char * const a; //指向类型对象的const指针。或者说常指针、const指针。const char * const a; //指向const对象的const指针。```
如果*const*位于`*`的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于`*`的右侧,*const*就是修饰指针本身,即指针本身是常量。
**指向常量的指针常量的值不可以修改(指向常量的指针)**
```c++const int * a =10;*a=20; //错误,不能更改常量的值,但是指针的指向可以修改```
**常量指针指向不可以修改,且必须初始化(常指针)**
```c++i#include<iostream>using namespace std;int main(){
int num=0; int * const ptr=&num; //const指针必须初始化!且const指针的值不能修改 int * t = &num; *t = 1; cout<<*ptr<<endl;}```
当把一个const常量的地址赋值给ptr时候,**由于ptr指向的是一个变量,而不是const常量**,所以会报错,出现:const int`*` -> int `*`错误!
```c++#include<iostream>using namespace std;int main(){ const int num=0; //const常量 int * const ptr=&num; //error! const int* -> int* cout<<*ptr<<endl;}```


除此之外,也不能使用void`*`指针保存const对象的地址,必须使用const void`*`类型的指针保存const对象的地址。
```c++const int p = 10;const void * vp = &p;void *vp = &p; //error```
**允许把非const对象的地址赋值给指向const对象的指针**
```c++const int *ptr;int val = 3;ptr = &val; //ok```
**指向常量的常指针**
```c++const int p = 3;const int * const ptr = &p; ```
**(3const修饰函数的形参列表**
1、对于非内部数据类型的参数而言,象void func(A a) 这样声明的函数注定效率比较低。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
2、对于内部数据类型来说,即常见的数据类型intdoublechar
内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
总结:**对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void func(A a) 改为void func(const A &a)。对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void func(int x) 不应该改为void func(const int &x)。**
**(4)类中使用const**
在一个类中,任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。使用const关字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字明的成员函数不能用来操作常对象。
对于类中的const成员变量必须通过初始化列表进行初始化,如下所示:
```c++class Apple{private: int people[100];public: Apple(int i); const int apple_number;};
Apple::Apple(int i):apple_number(i){
}```
const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
```c++//apple.cppclass Apple{private: int people[100];public: Apple(int i); //构造函数 const int apple_number; void take(int num) const; //const成员函数 int add(int num); int add(int num) const; //const成员函数 int getCount() const; //const成员函数
};//main.cpp#include<iostream>#include"apple.cpp"using namespace std;
Apple::Apple(int i):apple_number(i) //初始化{
}int Apple::add(int num){ take(num);}int Apple::add(int num) const{ take(num);}void Apple::take(int num) const{ cout<<"take func "<<num<<endl;}int Apple::getCount() const{ take(1);// add(); //error return apple_number;}int main(){ Apple a(2); cout<<a.getCount()<<endl; a.add(10); const Apple b(3); b.add(100); return 0;}//编译:g++ -o main main.cpp apple.cpp//结果take func 12take func 10take func 100```

推荐一篇博文,坚持不住的时候就多看看别人

你的编程能力从什么时候开始突飞猛进?- 拓跋阿秀的回答 - 知乎 https://www.zhihu.com/question/356351510/answer/1869223245


阿里云的这群疯子 - 史中的文章 - 知乎 https://zhuanlan.zhihu.com/p/46884081

以上是关于字符串合并处理:C++ bitset库和stoi()函数实践的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 stoi,如果字符串在 C++ 中有一个字母,则返回 false?

如何在 C++ 中使用 std::stoi() 验证 int 输入?

C++ 困境:关于 std::stoi

C++ std::stoi 异常:无效参数

c++知识点

std::stoi 的基本参数