我知道有功能
string::find_last_of
但是我想处理一大块 char* 数据。我不想将 char* 分配给字符串。
我知道有一个std函数
std::find
但它只能找到正序上的 char* 。有没有这样的方法可以逆序查找? 如果不在 std 中,有没有在 boost 中的方法?
std::find_end()
搜索 [first, last) 范围内元素的最后一个子序列 [s_first, s_last)。
例如
#include <algorithm>
char *data = ...;
char *data_end = data + size;
char toFind = ...;
char *pfind = &toFind;
char *found = std::find_end(data, data_end, pfind, pfind + 1);
if (found != data_end)
...
如果你想搜索一个字符,就像
std::find()
一样,你可以使用...std::find()
。看看std::reverse_iterator
:
auto foo(char* str, std::size_t size, char to_find)
{
auto rev_it = std::find(std::make_reverse_iterator(str + size),
std::make_reverse_iterator(str),
to_find);
auto it = std::make_reverse_iterator(rev_it);
}
boost中有一个功能可以解决这个问题。
boost::algorithm::find_last
示例:
char* s = "abcdabc";
cout << boost::algorithm::find_last(s, "b").begin() - s;
对于单字符搜索,现在有
std::ranges::find_last
(不幸的是仅在 C++23 中;并且没有 std::find_last
对应项)
https://en.cppreference.com/w/cpp/algorithm/ranges/find_last
示例:
#include<algorithm>
#include<vector>
#include<cassert>
...
std::vector<char> str{ '1','2','2','3','4' };
auto find = std::ranges::find_last(str.begin(), str.end(), '2'); // [last '2', str.end())
assert(find.begin() == str.begin() + 2 && find.end() == str.end());