2

重複の可能性:
C++ で std::string からスペースを削除する
std::remove が機能しない

std::remove を使用して、文字列からいくつかの文字を削除します。例えば:

std::string hash_value = "3f-2b-d6-ab-aa-6d-62-b4-ce-6f-6b-2f-21-4c-99-fc";
std::remove(hash_value.begin(), hash_value.end(), '-');

この後、hash_valueサイズは 32 で、次の値を持つ必要があります。

3F2BD6ABAA6D62B4CE6F6B2F214C99FC

しかし、それは 47 サイズと値:

3F2BD6ABAA6D62B4CE6F6B2F214C99FC-2F-21-4C-99-FC

私が間違っていることを助けてもらえますか?ありがとう!

4

3 に答える 3

4

remove-erase idiomを使用する必要があります。std::remove は要素をコンテナの最後に移動するだけです。後でそれらを消去する必要があります。

試す

hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end());
于 2013-01-27T12:30:44.773 に答える
2

std::removeは、「削除された」要素が最後になるようにシーケンスの内容を再配置します。ここで、end は、関数によって返される反復子とシーケンスの最後との間の範囲として定義されます。シーケンスを短くしたい場合は、erase-remove イディオムを使用してください。

hash_value.erase(std::remove(hash_value.begin(), hash_value.end(), '-'), hash_value.end()); 
于 2013-01-27T12:31:06.517 に答える
0

関数は、要素の範囲を含むオブジェクトのプロパティを変更できません (つまり、配列またはコンテナーのサイズを変更することはできません): 削除は、val と比較して等しい要素を、そうでない次の要素で置き換えることによって行われます。 、短縮された範囲の新しいサイズを通知するために、反復子をその新しい末尾要素と見なすべき要素に返します。

たとえば、std::remove に関連する以下の例を見てください。

int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20

// 範囲の境界:

int* pbegin = myints; // ^

int* pend = myints+sizeof(myints)/sizeof(int);

// コンテナー (論理) への保留ポイントを今すぐ終了

pend = std::remove (pbegin, pend, 20);

std::cout << "範囲の内容:";

for (int* p=pbegin; p!=pend; ++p)

std::cout << ' ' << *p;

表示されます

範囲に含まれるもの: 10 30 30 10 10

于 2013-01-27T13:43:05.217 に答える