0

文字列の一部 (部分文字列) を見つけて消去する必要があります。string_viewとても良いアイデアのようですが、次のように動作させることはできませんstring::erase:

// guaranteed to return a view into `str`
auto gimme_gimme_gimme(const std::string& str) -> std::string_view;

auto after_midnight(std::string& str)
{
    auto man = gimme_gimme_gimme(str);

    str.erase(man); // way to hopeful, not a chance though
    str.erase(man.begin(), man.end()); // nope
    str.erase(std::distance(str.begin(), man.begin()), man.size()); // nope
    str.erase(std::distance(str.data(), man.data()), man.size()); // nope again

    // for real???
}

私はこれを考えすぎていますか?文字列のその部分を消去std::string_viewする方法を与えられましたか? std::stringそれとも私は誤用していstring_viewますか?

4

2 に答える 2

1

私はこれを考えすぎていますか?

明らかな何かが欠けていない限り、あなたはそれを考えています。コードをコンパイルするには、次のものが必要です。

auto gimme_gimme_gimme(const std::string& str) -> std::string_view;

auto after_midnight(std::string& str)
{
    auto man = gimme_gimme_gimme(str);

    str.erase(std::distance(std::as_const(str).data(), man.data()), man.size()); // urrr... growling in pain
}

ちょっと待って!!もっとあります!「コンパイルする」と言ったことに注意してください。コードはエラーが発生しやすい!! なぜなら...

std::string::datanullptr にすることはできませんが、空string_viewは (文字列内の有効なポインター + サイズ0) または ( nullptr+ サイズ0) として表すことができます。問題が発生するのstring_view::datanulltprstd::distance使用されているためです。

string_viewしたがって、ビューが空であっても、常に文字列内を指していることを確認する必要があります。または、消去側で追加のチェックを行います。

于 2020-05-06T15:39:56.293 に答える