📜  C++中带有示例的std :: 字符串:: crbegin()和std :: 字符串:: crend()(1)

📅  最后修改于: 2023-12-03 15:14:02.123000             🧑  作者: Mango

C++ 中带有示例的 std::string::crbegin()和std::string::crend()

在 C++11 中,标准库增添了 std::string::crbegin()std::string::crend() 函数,这两个函数的功能是返回一个逆向迭代器(reverse iterator),指向字符串的最后一个字符(即末尾迭代器)。

std::string str = "Hello, world!";
auto iter = std::find(str.crbegin(), str.crend(), ',');

if (iter != str.crend()) {
    std::cout << "Comma found at index: " << iter.base() - str.begin() - 1 << std::endl;
} else {
    std::cout << "Comma not found." << std::endl;
}

在上面的示例代码中,我们使用 std::string::crbegin() 获取到字符串的末尾迭代器,并且我们可以通过它来进行逆向遍历。在这个示例中,我们使用了 STL 中的 std::find() 算法来查找字符串中逗号的位置。最后,我们将末尾迭代器通过 iter.base() 转换成正向迭代器,并从正向迭代器中减去起始迭代器 str.begin(),最终计算出逗号在字符串中的位置。

需要注意的是,由于末尾迭代器指向的是字符串最后一个字符的下一个位置,因此在计算位置时需要减去 1。

在某些情况下,使用 std::string::crbegin()std::string::crend() 可以简化代码,使得其更加直观易懂。下面是一个示例,演示了如何使用 std::string::erase() 和逆向迭代器从字符串中删除所有的空格。

std::string str = "   Hello,  world!   ";
str.erase(std::remove_if(str.crbegin(), str.crend(), ::isspace).base(), str.end());

std::cout << str << std::endl;   // Output: "Hello,world!"

在上面的示例中,我们使用 remove_if() 算法配合 isspace() 函数(判断空格字符)从字符串中删除空格,但我们是从字符串末尾开始遍历的,那么我们需要通过 base() 将逆向迭代器转换成正向迭代器,从而调用 erase() 函数。

总之,std::string::crbegin()std::string::crend() 可以帮助我们更方便地进行字符串的逆向遍历。需要注意的是,它们只能应用于支持双向迭代器(Bidirectional Iterator)的容器,例如 std::list