2017-02-03 71 views
0

有没有方法可以找到并替换集合中char * /字符串的子集?集合中元素的子字符串

例子:

std::set<char*> myset; 
myset.insert("catt"); 
myset.insert("world"); 
myset.insert("hello"); 

it = myset.subsetfind("tt"); 
myset.replace(it, "t"); 
+4

对于关联容器,不应该使用指针作为关键字,因为它将是***指针***,这是键而不是它指向的数据。如果你想让这个键是一个字符串,那么你应该使用'std :: string'。 –

回答

0

可能使用std::find_if与谓词函数/仿/λ,搜索你想要的字符串。

1

这至少有三个原因不起作用。

  1. std::set仅提供了手段来搜索该组为所搜索的,而不是相匹配的值的一些任意部分的值,该值同样进行比较的值的值。

  2. 显示的程序是未定义的行为。字符串文字(如“hello”)是const char *,而不是char *。没有自尊心的C++编译器将允许您将const char *插入到char *的容器中。无论如何,您无法修改const值。

  3. std::set中的值无法修改。要修改集合中的现有值,它必须是erase()d,然后是新值insert()ed。

std::set根本就不是您想要完成的目标的正确容器。

+0

不幸的是,ICC,GCC和Clang都只编译了GCC和Clang发出警告。 – NathanOliver

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); 
} 
1

您不能修改集合中的元素。

您可以使用std::find_if查找包含子字符串的字符串。一旦找到匹配的元素,您可以从集合中删除每个元素,并添加字符串的修改副本,其中子字符串替换为其他字符。

PS。请记住,您不能修改字符串文字。您将需要为字符串分配一些内存。

PPS。字符串文字到char*的隐式转换已被弃用,因为C++是标准化的,并且由于C++ 11这种转换是格式不正确的。

PPPS。当您使用指针作为元素类型时,默认比较器将不正确。我建议您改用std::string。 (基于A strcmp的比较器方法也是可能的,尽管更容易出现内存错误)。