C++中的Compare()函数

本文深入探讨了在C++中使用std::string的compare方法进行字符串比较时可能遇到的问题,特别是当字符串中包含null终止符时的行为差异。通过具体代码示例,揭示了compare与传统strcmp函数在处理此类情况下的不同之处,强调了在不确定字符串内容时应如何正确转换和比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include < iostream >
#include < string>
#include < cctype>
using std::cout;
using std::endl;
using std::cin;
using std::string;
int main(void){
string str1=“hi,test,hello”;
string str2=“hi,test”;
//字符串比较
if(str1.compare(str2)>0)
printf(“str1>str2\n”);
else if(str1.compare(str2)<0)
printf(“str1<str2\n”);
else
printf(“str1==str2\n”);

//str1的子串(从索引3开始,包含4个字符)与str2进行比较  
if(str1.compare(3,4,str2)==0)  
    printf("str1的指定子串等于str2\n");  
else  
    printf("str1的指定子串不等于str2\n");  
  
//str1指定子串与str2的指定子串进行比较  
if(str1.compare(3,4,str2,3,4)==0)  
    printf("str1的指定子串等于str2的指定子串\n");  
else  
    printf("str1的指定子串不等于str2的指定子串\n");  
  
//str1指定子串与字符串的前n个字符进行比较  
if(str1.compare(0,2,"hi,hello",2)==0)  
    printf("str1的指定子串等于指定字符串的前2个字符组成的子串\n");  
else  
    printf("str1的指定子串不等于指定字符串的前2个字符组成的子串\n");  
return 0;  

}

场景

  1.std::string 我们经常用来存储字符串数据, 当然它也可以作为byte的存储器,存储任意字节.

  2.通常情况下我们使用 std::string 的 compare 方法比较字符串, 但这个方法比较奥字符串是不可靠的.

说明

1.compare 方法和 strcmp并不相同, 它比较的是 std::string size()大小里的所有字节.在size() 长度范围里, 如果有’\0’字符, 一样进行比较, 所有在不知道 std::string里是否存储纯字符串时, 最好先转换为 const char* (调用c_str()) , 再调用 strcmp比较. 这个坑还是很吓人的.

例子

1.以下例子很好的说明在比较字符串时 compare并不适合.

#include < iostream>
#include < string.h>

int main(int argc, char const *argv[]){
std::string str(“hello”);
str.append(1,’\0’);
str.append(1,‘i’);

std::cout << str.size() << std::endl;
std::cout << str << std::endl;
std::cout << str.compare(“hello”) << std::endl;
std::cout << strcmp(str.c_str(),“hello”) << std::endl;

return 0;
}

输出:

$ ./test-string.exe
7
hello
2
0

### C++ 中 `std::sort` 的自定义比较函数用法 在 C++ 中,`std::sort` 是标准库中的一个高效排序算法,位于 `<algorithm>` 头文件中。它允许通过提供自定义比较函数来控制排序的行为。以下是关于如何使用自定义比较函数的一些重要细节: #### 自定义比较函数的基本概念 为了实现特定的排序逻辑,可以向 `std::sort` 提供一个二元谓词作为第三个参数。该谓词接受两个元素并返回布尔值,指示第一个元素是否应排在第二个之前[^1]。 #### 使用 Lambda 表达式作为比较器 Lambda 表达式是一种简洁的方式,用于定义简单的匿名函数。下面是一个示例,展示如何按降序排列整数数组: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {5, 2, 9, 1, 5, 6}; // 使用 lambda 表达式定义降序排序规则 std::sort(numbers.begin(), numbers.end(), [](const int& a, const int& b) -> bool { return a > b; }); for (auto num : numbers) { std::cout << num << " "; } return 0; } ``` 在这个例子中,lambda 函数 `(a, b) -> bool { return a > b; }` 定义了一个降序排序规则。 #### 使用独立函数作为比较器 除了 lambda 表达式外,还可以传递普通的函数指针给 `std::sort`。例如: ```cpp bool compareDescending(const int& a, const int& b) { return a > b; } int main() { std::vector<int> numbers = {5, 2, 9, 1, 5, 6}; std::sort(numbers.begin(), numbers.end(), compareDescending); for (auto num : numbers) { std::cout << num << " "; } return 0; } ``` 这里,`compareDescending` 被用来指定降序排序规则。 #### 对复杂数据类型的排序 当处理更复杂的结构体或类时,可以通过成员变量定制排序行为。以下是对对象列表按照某个字段升序排序的例子: ```cpp struct Person { std::string name; int age; // 构造函数便于初始化 Person(std::string n, int a) : name(n), age(a) {} }; // 比较两个人的年龄 bool compareByAge(const Person& p1, const Person& p2) { return p1.age < p2.age; } int main() { std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}}; std::sort(people.begin(), people.end(), compareByAge); for (const auto& person : people) { std::cout << person.name << ": " << person.age << "\n"; } return 0; } ``` 此代码片段展示了基于 `Person` 类型的对象集合按年龄从小到大排序的过程。 #### 常见注意事项 - **稳定性**:默认情况下,`std::sort` 不保证稳定排序(即相等元素的原始顺序可能改变)。如果需要保持稳定性,则应该改用 `std::stable_sort`。 - **性能**:`std::sort` 实现的是快速排序变种,平均时间复杂度为 O(N log N),但在最坏情况下的表现取决于具体实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值