如何使用std::string_view与反向迭代器?构造失败原因解析
为什么用反向迭代器构造std::string_view会失败?
核心原因
std::string_view的迭代器范围构造函数有个关键约束:传入的迭代器必须是连续迭代器(ContiguousIterator)。而std::string::const_reverse_iterator是反向迭代器适配器,不属于连续迭代器范畴——哪怕它底层指向连续内存,标准也没将其归类为连续迭代器,因此编译器找不到匹配的构造函数,直接报错。
反观std::string::const_iterator是标准的连续迭代器,完全满足构造要求,所以用正向迭代器构造string_view可以正常工作。
无内存分配的正确回文实现
既然要避免内存分配,根本不需要构造反向的string_view,直接用以下几种方式实现即可,效率更高:
方法1:双迭代器对比
bool is_palidrome(const std::string& s) { auto left = s.cbegin(); auto right = s.cend(); while (left < --right) { if (*left != *right) return false; ++left; } return true; }
方法2:用std::equal简化代码
#include <algorithm> bool is_palidrome(const std::string& s) { return std::equal(s.cbegin(), s.cbegin() + s.size()/2, s.crbegin()); }
方法3:基于string_view的随机访问
如果非要借助string_view,直接利用它的随机访问特性对比首尾字符:
bool is_palidrome(const std::string& s) { std::string_view sv(s); const size_t len = sv.size(); for (size_t i = 0; i < len / 2; ++i) { if (sv[i] != sv[len - 1 - i]) return false; } return true; }
内容的提问来源于stack exchange,提问作者apelle
相关产品推荐
相关产品推荐

