2017-03-13 15 views
3

のバイト範囲を交換する: [1,1,1,9,9,9,1,1,1]STD関数はIバイト(スタンダード::ベクトル)のベクトルを有するベクトル

Iバイト3〜6を未知の長さのバイトで置き換えたいとします(実行時obvでわかります)。 ベクトルの長さが伸びたり、シークしたり、同じままになることがあります。 しかし、私は置き換えたいバイトの開始点と終了点を知っています。

私は消去または挿入を使用してサイズを調整し、次に新しいデータを古いデータにループすることでこれを行うことができます。

std :: replaceは、バイトと一致する検索と置換を行いますが、置き換えたいバイトはわかります。そしてstd :: replaceは1つの要素だけを置き換えるようです。私はデータのBLOBに置き換えたいです。

確かにこれを「きれいに」行うことができる標準機能がありますか? (私が望むなら、私はあなたをシャイリーに電話します)。

+0

あなたはコンパイル時に知ってどのくらい?あなたはベクトルの元の内容を知っていますか?少なくともサイズは?または少なくとも挿入する前に削除する必要がある範囲ですか? –

答えて

1

std::vector::insertは範囲を挿入できるので、既存の要素はeraseとし、新しい要素を挿入します。

+0

はい。私の最初の考え。私はより効率的になりたいです。後で必要になる可能性のあるスペースを削除しないでください。大量のデータを保存する。 – TinyRacoon

+2

'std :: copy'(ベクトル内のものと重複する範囲の部分をコピーする)と' erase'または 'insert'(ベクトルのサイズを適切に調整する)の組み合わせを行うことができます。 –

+3

手順1でコピーされなかった要素をコピーするには、(1)挿入する**または**要素を消去して、最終的な長さを正しくする(2)2つの手順で行います。 –

1

短い答え:私がここに表示されるものと 、それはstd::vectorは非常に悪い選択であるように私には聞こえる:あなたの問題のための究極のソリューションは、私たちがあなたから

長い答えの詳細を取得しない限りありませんこのため。 std::vectorは(C++ 03から始まる)、メモリ内の連続で、何をやっていることは2つの可能な結果を​​持っています

  1. あなたは、コンテナの同じ大きさをしておこう、とベクトルは、この
  2. に最適です
  3. あなたは真ん中からベクトルのサイズを変更し、これは恐ろしいベクトルです!しかし、std::dequeはこれの中核です。その理由はhereです。 (ほぼ)一定の時間内にやりたいことを正確にサポートし、一定の時間に要素アクセスを提供します。

あなたが行くためにどの方法を決定する答える必要があり質問はです:どのくらいの頻度でそのないものに比べて、ベクトルの大きさを変更します交換をする必要があるのですか?ベクトルのサイズの変更が非常に小さい場合にのみ、std::vectorが良い選択です。そうでない場合は、に変更すると、std::dequeに切り替えることを検討してください。

標準の中に私に代わるものがありますか?

標準では、あなた自身で書く機能でできるだけ効率的にこれを行うためのすべてのツールが用意されています。消去して(必要な場合)、挿入します。それはそれと同じくらい簡単です。削除したい部分がある場合

  • は常に特別な場合を考える

    1. 消去が唯一の違いは、置き換えたい全体を消去していない、前者はより良い行います:二つのことを覚えておいてください配置したい配列と同じ大きさでなければなりません。その場合、何も削除したり挿入したりしないでください。これにより、多くのパフォーマンスが節約されます。値がすべて同じであり、あなたが交換したい間隔がベクター内にあることがわかっている場合
  • 1

    std::fill使用:この行は、ベクトルvとに3-6の要素を交換します

    std::fill(v.begin() + 3, v.begin() + 6, 9); 
    

    値9.

    あなたが入れたいの値がすべて同じでない場合は、(あなたは、交換をベクターに適合することを確認する必要があります)の代わりにstd::copyを使用します。

    std::copy(replacement.begin(), replacement.end(), v.begin() + 3); 
    

    ベクトルvの位置は3から始まり、内容はreplacementです。

    あなたはベクトルの大きさがわからない場合は、まず大きさを補正してもよい:

    v.resize(6); 
    
    関連する問題