有没有办法在一个集合中找到并替换char*/string的子集?
示例:
std::set<char*> myset;
myset.insert("catt");
myset.insert("world");
myset.insert("hello");
it = myset.subsetfind("tt");
myset.replace(it, "t");
发布于 2017-02-03 16:45:34
至少有三个原因可以解释为什么这个方法行不通。
std::set
只提供了在集合中搜索与所搜索的值相等的值的方法,而不提供与值的某个任意部分匹配的值。const char *
,而不是一个char *
。没有一个自重的C++编译器会允许您将const char *
插入到char *
的容器中,并且您不能修改const
的值,根据定义,std::set
中的anyway.insert
()ed. ()d,然后是新值erase
对于您试图实现的目标,std::set
根本不是合适的容器。
发布于 2017-02-03 16:46:17
不,你不能(或者至少不应该)修改在集合中的键。这样做可能会更改元素的相对顺序,在这种情况下,修改会使集合无效。
您需要从一组可以修改的内容开始。然后,您需要搜索该项,将其从集合中删除,对其进行修改,然后将结果重新插入到集合中。
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);
}
发布于 2017-02-03 16:48:18
不能修改集中的元素。
您可以使用std::find_if
查找包含子字符串的字符串。一旦找到匹配的元素,就可以从集合中删除每个元素,并添加一个修改后的字符串副本,并将子字符串替换为其他内容。
PS。请记住,您不能修改字符串文字。您将需要为字符串分配一些内存。
PPS。自从char*
被标准化以来,字符串文字到C++的隐式转换一直被弃用,而且自C++11以来,这种转换是病态的。
PPPS。当您使用指针作为元素类型时,默认比较器将不正确。我建议您改用std::string
。(基于strcmp
的比较器方法也是可能的,尽管更容易出现内存错误)。
https://stackoverflow.com/questions/42028946
复制相似问题