首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中是否有内置的std::string函数来按字母顺序比较两个字符串时,其中一个字符串可以是大写还是小写?

在C++中是否有内置的std::string函数来按字母顺序比较两个字符串时,其中一个字符串可以是大写还是小写?
EN

Stack Overflow用户
提问于 2015-02-07 21:04:08
回答 6查看 10.1K关注 0票数 8

对于C++,我知道如果两个单词都是完全小写或完全大写的话,基本的比较运算符就可以完成这个任务。我有一个字符串数组,字母可以从下到上变化。下面是我可以使用的字符串类型的一个小例子:

“富足人生”

“新生活”

“新生活大会”

我知道在Java中存在函数String.compareToIgnoreCase()。是否有与此函数等价的C++?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-02-07 21:12:04

我不知道标准库中有任何不区分大小写的函数,但是可以为std::equal指定一个自定义谓词。

代码语言:javascript
复制
std::string a("hello");
std::string b("HELLO");
std::cout << std::equal(a.begin(), a.end(), b.begin(),
    [] (const char& a, const char& b)
    {
        return (std::tolower(a) == std::tolower(b));
    });

有关考虑区域设置的解决方案,请参阅Case insensitive std::string.find()

代码语言:javascript
复制
#include <locale>

template<typename charT = std::string::value_type>
struct my_equal {
    my_equal( const std::locale& loc ) : loc_(loc) {}
    bool operator()(charT ch1, charT ch2) {
        return std::toupper(ch1, loc_) == std::toupper(ch2, loc_);
    }
private:
    const std::locale& loc_;
};

int main()
{
    std::string a("hello");
    std::string b("HELLO");
    std::cout << std::equal(a.begin(), a.end(), b.begin(),
        my_equal<>(std::locale()));
}
票数 9
EN

Stack Overflow用户

发布于 2015-02-07 22:00:08

是的,在C++中有一种不区分大小写的比较字符串的方法。关键是std::string是一个模板:

代码语言:javascript
复制
template <class charT,
          class traits = char_traits<charT>,
          class Allocator = allocator<charT>>
class basic_string;

这里的traits控制着charT之间的联系。对于普通的std::string,他们会做你期望的事情,但我们可以只写我们自己的不区分大小写的特征:

代码语言:javascript
复制
struct case_insensitive_traits
: char_traits<char>
{
    static bool eq(char a, char b) { return tolower(a) == tolower(b); }
    static bool ne(char a, char b) { return !eq(a, b); }
    static bool lt(char a, char b) { return tolower(a) < tolower(b); }
    static bool gt(char a, char b) { return tolower(a) > tolower(b); }

    static int compare(const char* a, const char* b, size_t n)
    {
        for (size_t i = 0; i < n; ++i) {
            int delta = tolower(a[i]) - tolower(b[i]);
            if (delta != 0) return delta;
        }
        return 0;
    }

    static const char* find(const char* s, size_t n, char c)
    {
        c = tolower(c);
        for (size_t i = 0; i < n; ++i, ++s) {
            if (tolower(*s) == c) return s;
        }
        return nullptr;
    }
};

在此基础上:

代码语言:javascript
复制
using case_insensitive_string = std::basic_string<char, case_insensitive_traits>;

case_insensitive_string a{"hello"};
case_insensitive_string b{"hElLo"};

assert(a == b);
票数 7
EN

Stack Overflow用户

发布于 2015-02-07 22:54:00

您可以使用Boost字符串算法:

代码语言:javascript
复制
#include <string>
#include <cassert>

#include <boost/algorithm/string.hpp>

int main() {
    std::string s { "Test" };
    assert(boost::iequals(s, "TEST"));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28387362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档