有没有办法在集合中查找和替换char * / string的子集?
示例:
std::set<char*> myset;
myset.insert("catt");
myset.insert("world");
myset.insert("hello");
it = myset.subsetfind("tt");
myset.replace(it, "t");
答案 0 :(得分:1)
至少有三个原因可以解决这个问题。
std::set
仅提供搜索集合的方法,以便与搜索的值进行相等的比较,而不是与值的某个任意部分匹配的值。
显示的程序是未定义的行为。字符串文字,例如“hello”是const char *
,而不是char *
。没有自尊的C ++编译器允许您将const char *
插入到char *
的容器中。根据定义,您无法修改const
值。
无法修改std::set
中的值。要对集合中的现有值进行修改,必须为erase
()d,然后是新值insert
()ed。
std::set
根本不是您想要完成的目标的正确容器。
答案 1 :(得分:1)
不,你不能(或者至少不应该)在集合中修改密钥。这样做可能会改变元素的相对顺序,在这种情况下,修改会使集合无效。
您需要从一组可以修改的内容开始。然后你需要搜索项目,从集合中删除它,修改它,然后将结果重新插入到集合中。
std::set<std::string> myset {"catt", "world", "hello"};
auto pos = std::find_if(myset.begin(), myset.end(), [](auto const &s) { return s.find("tt");};
if (pos != myset.end()) {
auto temp = *pos;
myset.remove(pos);
auto p= temp.find("tt");
temp.replace(p, 2, "t");
myset.insert(temp);
}
答案 2 :(得分:1)
您无法修改集合中的元素。
您可以使用std::find_if
找到包含子字符串的字符串。找到匹配的元素后,您可以从集合中删除每个元素并添加字符串的修改后的副本,并将子字符串替换为其他内容。
PS。请记住,您无法修改字符串文字。您需要为字符串分配一些内存。
PPS。由于C ++是标准化的,因此字符串文字到char*
的隐式转换已被弃用,而且由于C ++ 11这种转换形式不正确。
PPPS。使用指针作为元素类型时,默认比较器将不正确。我建议你改用std::string
。 (基于strcmp
的比较器方法也是可行的,尽管更容易出现内存错误。)
答案 3 :(得分:0)
你可以使用std::find_if
与谓词函数/ functor / lambda一起搜索你想要的子字符串。