c++ - std::search 找到最右边的子序列
问题描述
我试图在std::search
和的范围内找到最右边的子序列std::make_reverse_iterator
。
然而,返回的迭代器总是指向一个范围的开始。我究竟做错了什么?
TEST(basic_test, find_from_right)
{
std::vector<uint8_t> array{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::array<uint8_t, 2> subSeq{3, 4};
auto found = std::search(std::make_reverse_iterator(array.cend()),
std::make_reverse_iterator(array.cbegin()),
subSeq.cbegin(),
subSeq.cend());
// makes no difference
// std::make_reverse_iterator(subSeq.cend()),
// std::make_reverse_iterator(subSeq.cbegin()));
auto distance = std::distance(found.base(), array.cbegin());
EXPECT_EQ(distance, 3);
}
输出:
Failure
Expected equality of these values:
distance
Which is: 0
3
我有一个带有 2 个模板 RandomIterators 的函数,所以我必须调用std::make_reverse_iterator
. 这些容器只是为了重现问题和编译示例。
解决方案
我认为这可以解决您的问题(如果您对 C++17 没问题):
来自https://en.cppreference.com/w/cpp/algorithm/find_end:
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
std::vector<int>::iterator result;
std::vector<int> t1{1, 2, 3};
result = std::find_end(v.begin(), v.end(), t1.begin(), t1.end());
if (result == v.end()) {
std::cout << "sequence not found\n";
} else {
std::cout << "last occurrence is at: "
<< std::distance(v.begin(), result) << "\n";
}
std::vector<int> t2{4, 5, 6};
result = std::find_end(v.begin(), v.end(), t2.begin(), t2.end());
if (result == v.end()) {
std::cout << "sequence not found\n";
} else {
std::cout << "last occurrence is at: "
<< std::distance(v.begin(), result) << "\n";
}
}
所以在你的情况下:
auto result = std::find_end(array.begin(), array.end(), subSeq.begin(), subSeq.end());
if (result == array.end()) {
std::cout << "sequence not found\n";
} else {
std::cout << "last occurrence is at: "
<< std::distance(array.begin(), result) << "\n";
}
推荐阅读
- javascript - HTML5 视频 - 在不知道视频长度的情况下在最后淡出视频
- python - python 的 paramiko load_system_host_keys() 抛出 AttributeError: 'int' object has no attribute 'value' (密码学)
- spring - Spring Freemarker 表单绑定:指数值问题
- c - 为什么 shm_open 创建的 memset 共享内存会导致 aarch64 上的 sigbus err
- python - 如何使用 Pandas 将增量数字添加到 Dataframe
- regex - 替换正则表达式中的字符时出现问题
- python - 使用 python tkinter 在标签小部件上创建项目符号列表
- android - 如何在 Coordinator 布局中设置底部折叠布局
- tensorflow - 评估使用 Tensorflow 对象检测 API 创建的模型
- android - 在 RecyclerView 中选择 CardView 的位置并在 RecyclerView 中更改 Fragment