有没有方法可以找到并替换集合中char * /字符串的子集?集合中元素的子字符串
例子:
std::set<char*> myset;
myset.insert("catt");
myset.insert("world");
myset.insert("hello");
it = myset.subsetfind("tt");
myset.replace(it, "t");
有没有方法可以找到并替换集合中char * /字符串的子集?集合中元素的子字符串
例子:
std::set<char*> myset;
myset.insert("catt");
myset.insert("world");
myset.insert("hello");
it = myset.subsetfind("tt");
myset.replace(it, "t");
您可能使用std::find_if
与谓词函数/仿/λ,搜索你想要的字符串。
这至少有三个原因不起作用。
std::set
仅提供了手段来搜索该组为所搜索的,而不是相匹配的值的一些任意部分的值,该值同样进行比较的值的值。
显示的程序是未定义的行为。字符串文字(如“hello”)是const char *
,而不是char *
。没有自尊心的C++编译器将允许您将const char *
插入到char *
的容器中。无论如何,您无法修改const
值。
std::set
中的值无法修改。要修改集合中的现有值,它必须是erase
()d,然后是新值insert
()ed。
std::set
根本就不是您想要完成的目标的正确容器。
不幸的是,ICC,GCC和Clang都只编译了GCC和Clang发出警告。 – NathanOliver
不,你不能在(或至少不应该)修改密钥的时候,这样做可能会改变元素的相对顺序,在这种情况下,修改会导致集合无效。
你需要从一组你可以修改的东西开始。然后,您需要搜索该项目,将其从该集合中删除,对其进行修改,然后将结果重新插入到集合中。
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);
}
您不能修改集合中的元素。
您可以使用std::find_if
查找包含子字符串的字符串。一旦找到匹配的元素,您可以从集合中删除每个元素,并添加字符串的修改副本,其中子字符串替换为其他字符。
PS。请记住,您不能修改字符串文字。您将需要为字符串分配一些内存。
PPS。字符串文字到char*
的隐式转换已被弃用,因为C++是标准化的,并且由于C++ 11这种转换是格式不正确的。
PPPS。当您使用指针作为元素类型时,默认比较器将不正确。我建议您改用std::string
。 (基于A strcmp
的比较器方法也是可能的,尽管更容易出现内存错误)。
对于关联容器,不应该使用指针作为关键字,因为它将是***指针***,这是键而不是它指向的数据。如果你想让这个键是一个字符串,那么你应该使用'std :: string'。 –