问题描述
我有一个匹配表,其中包含数组中部分的开始和结束索引(在回调中) - 我将该数组包装成字符串向量 - 现在最近我确实需要修改字符串的原始部分。
struct regexcontext {
std::vector<std::optional<std::string>> matches;
std::string subject;
};
int buildmatchvector(size_t(*offset_vector)[2],int max,regexcontext* pcontext) {
pcontext->matches.clear();
ranges::transform(ranges::span{ offset_vector,max },std::back_inserter(pcontext->matches),[&](const auto& refarr) {
return refarr[0] == -1 ? std::optional<std::string> {} : std::optional<std::string>{ pcontext->subject.substr(refarr[0],refarr[1] - refarr[0]) };
});
return 0;
}
是否可以通过修改匹配向量来更改上述定义,我也会修改主题字符串。
我听说过字符串视图,但我也听说不能用可变大小的字符串修改它。
注意我正在使用 ranges-v3
,它是目前唯一实现标准范围的库加上非标准的 ranges::span
,它允许我在 msvc 上编译(因为 std::span
没有出于某种原因在那里工作)。
解决方法
只要您只需要将字符更改为其他字符,而不是添加或删除字符,那么您可以使用 span
的向量。支持添加或删除会复杂得多,我认为标准库中没有任何简单的解决方案。示例:
return refarr[0] == -1
? span<char> {}
: span<char> {
&pcontext->subject[refarr[0]],refarr[1] - refarr[0]
};
请注意,对指向字符串的任何无效操作都会使这些跨度无效,因此将字符串设为私有是个好主意。