c++ - 字符串替换后如何获取有效的迭代器
问题描述
我想在 Windows 下使用迭代器在 C++ 中进行一些字符串替换。这是代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <iterator>
size_t iterator_to_size_t(std::string &string, std::string::iterator it)
{
size_t pos;
pos = std::distance(string.begin(), it);
return pos;
}
int main()
{
std::string text = "TTTTbcdefghijklmnopqrstuvwxyz";
std::string findtext = "TTTT";
std::string replacementtext = "123456";
for (std::string::iterator it = text.begin(); it!=text.end(); ++it)
{
size_t z = iterator_to_int(text, it);
if (text.compare(z, findtext.length(), findtext) == 0)
{
text.replace(z, findtext.length(), replacementtext);
}
}
return 0;
}
string::replace 方法显然使迭代器无效。我收到一条错误消息说。我试图将 string::replace 的返回值分配给迭代器以获取新的有效迭代器,但返回值似乎不兼容。
我怎样才能在这里得到一个有效的迭代器,或者我必须使用索引而不是迭代器?
解决方案
您可以在替换后重新计算迭代器,例如
if (text.compare(z, findtext.length(), findtext) == 0)
{
text.replace(z, findtext.length(), replacementtext);
it = text.begin() + z + replacementtext.size();
}
此外,有一个使用迭代器的循环,从这些迭代器计算位置索引并使用位置索引来获取迭代器确实很麻烦。我建议你考虑以下几点。
#include <regex>
const std::regex re{"TTTT"};
text = std::regex_replace(text, re, replacementtext);
推荐阅读
- c# - Chrome Driver Headless 为我们节省了 html 和资源
- javascript - Javascript 正则表达式用双引号包裹不带引号的 JSON 值和键
- c++ - 如何使用g ++打印≠到终端?
- python - Django patch save in unittest
- python - Python + selenium download image without extension
- sql - How to extract everything after 1st series of numbers PL/SQL
- c# - TAB 没有进入我的 win 表单中嵌入的 ActiveX 控件
- ajax - 使用 genymotion 模拟器的问题服务器请求
- vba - 删除 PPT 演示文稿中的所有内容,但图表?
- c - 单个大规模阵列单元动态分配,表现为具有多个较小单元的阵列