2012-03-13 4 views
3

std::vectorをforループ内で再利用したいと思います。しかし、私はforループの各反復ステップのためにベクトルを空にする必要があります。サイズを変更せずにstd :: vectorを空にします

質問:ベクトルを最も効率的な方法で容量を変更せずにすばやく空にするにはどうすればよいですか?私がこれまでに使用したもの

std::vector<int> myVec; 
for(int i=0; i<A_BIG_NUMBER; ++i) { 
    std::vector<T>().swap(myVec); 
    myVec.reserve(STANDARD_MAXIMUM); 

    /// .. doing business 
} 

乾杯です!

ソリューション:回答を

おかげで、ここではそれは私が(チェック)に実装する方法である:

#include <vector> 
#include <iostream> 

int main() { 

    int n = 10; 
    std::vector<int> myVec; 
    myVec.reserve(n); 
    for(int j=0; j<3; ++j) { 
      myVec.clear(); 
      for(int i=0; i<n; ++i) { 
        myVec.push_back(i); 
      } 
      for(int i=0; i<myVec.size(); ++i) { 
        std::cout << i << ": " << myVec[i] << std::endl; 
      } 
    } 

    return 0; 
} 

EDIT:push_backoperator[]から変更しました。

+0

選択されたソリューションが間違っているだけでなく、質問にも意味がありません。ベクトルのサイズを一定にしたい場合は、それをクリアしないでください。既存の要素の上に上書きするか、各要素を個別にリセットするだけです。 –

+0

@BoPersson:うん、自分を騙した。あまりにも多くを得ることを望んでいた..私はそれを私の質問から切り取った。 – ezdazuzena

+0

'algorithm'ライブラリから' remove'を探していましたか? –

答えて

8

vector::clearメソッドを使用してください。容量を減らさずにコンテンツをクリアします。

+0

ありがとう、それは仕事をしている! +1 – ezdazuzena

+1

しかし、サイズを減らして、上記の 'myVec [i] = i;'を不正にします。 –

+0

はい、私は同意します.. @ ezdazuzena:提案したように 'push_back'を使うべきです.. – Asha

4
myVec.clear(); 

これはmyVec.erase(myVec.begin(), myVec.end())に相当します。

2

使用以下のように明確な方法:

std::vector<int> myVec; 
    for(int i=0; i<A_BIG_NUMBER; ++i) 
    { 
     std::vector<T>().swap(myVec); 
     myVec.reserve(STANDARD_MAXIMUM); 

     /// .. doing business 
    myVec.clear(); 
    } 
+2

さて、この場合、彼はおそらく彼のスワップ/リバースのことは必要ないでしょうか? –

+0

私の間違いをお詫び申し上げます... – shofee

0

OPのソリューションに基づいて回答:
コンテナのための通常のアプローチは、空の容器で始まるとstdのための例外を除いて、必要に応じてそれを埋めることです::コンテナ内にオブジェクトが残っていなくてもスペースを予約することができます。
「空のコンテナ」は、配列のようにアクセスできるデフォルトのオブジェクトのコンテナです(std :: vectorとstd :: dequeでのみ動作します)。次に、resizeで始める必要があります()と、塗りと「クリーンアップ」することができます

int n = 10; 
std::vector<int> myVec; 
myVec.resize(n); 
myVec[4] = 5; 
std::cout << myVec[4] << "\n"; 
std::fill(myVec.begin(), myVec.end(), int()); // ofcourse for int, you can use 0 instead of int() 
std::cout << myVec[4] << "\n"; 
0

そのコンテンツのデフォルト値を持つベクトルの現在のサイズを維持するには、ベクトルにデフォルト値を割り当てることができます。 intのベクトルの場合は、次のようにすることができます。

myVec.assign(myVec.size(), 0); 
関連する問題