时间:2017-02-03 16:39:23

标签: c++ set substring

有没有办法在集合中查找和替换char * / string的子集?

示例:

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

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

4 个答案:

答案 0 :(得分:1)

至少有三个原因可以解决这个问题。

  1. std::set仅提供搜索集合的方法,以便与搜索的值进行相等的比较,而不是与值的某个任意部分匹配的值。

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

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

  4. 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一起搜索你想要的子字符串。