2017-02-03 72 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的比較器方法也是可能的,儘管更容易出現內存錯誤)。