📅  最后修改于: 2023-12-03 15:14:02.123000             🧑  作者: Mango
在 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
。