2009-05-07 7 views
12

私は、コンテナが所有していないポインタのベクトルを持っています。ポインタのターゲット上でアルゴリズムを使用するにはどうすればよいですか?私はブーストのptr_vectorを使用しようとしましたが、スコープから外れるとポインタを削除しようとします。ここでどのようにポインタのベクトルでSTLアルゴリズムを使用するのですか

が動作する必要がありますいくつかのコードです:

vector<int*> myValues; 
// ... myValues is populated 
bool consistent = count(myValues.begin(), myValues.end(), myValues.front()) == myValues.size(); 
auto v = consistent ? myValues.front() : accumulate(myValues.begin(), myValues.end(), 0)/myValues.size(); 
fill(myValues.begin(), myValues.end(), v); 
// etc. 

私はループのために働くだろうと実感が、これは場所の束で起こるので、単項アダプタのいくつかの種類?私は1つを見つけることができませんでした。前もって感謝します!

+0

あなたの質問に未だ承認されていない将来のC++標準の機能を使用すると、得られる回答が制限されます。あなたの質問が現在の標準ライブラリ、Boostの使用、またはC++ 0xの新機能に関するものかどうかは非常に不明です。 –

+0

vはintの平均値であると考えられますが、コピーラインはvにコピーしようとします。したがって、vはポインタまたはイテレータでなければなりません。 –

+0

ああ、最後の行が間違っていた...私は "コピー"の代わりに "塗りつぶし"を書くつもりだった。 –

答えて

19

Boost Indirect Iteratorを使用できます。逆参照された場合(operator*())、に参照外の参照が適用されるため、イテレータによって参照されるポインタによって指し示される値になります。詳細については、this question about a dereference iteratorもご覧ください。

は簡単な例です:

std::vector<int*> vec; 

vec.push_back(new int(1)); 
vec.push_back(new int(2)); 

std::copy(boost::make_indirect_iterator(vec.begin()), 
      boost::make_indirect_iterator(vec.end()), 
      std::ostream_iterator<int>(std::cout, " "));  // Prints 1 2 
+0

これはまさに私が探していたものです、ありがとう! –

+0

ああ、あなたの質問でした - 知識を渡す方法) –

0

boost::shared_ptr<> - 参照カウント付きのスマートポインタです。スコープ外に出た後はポインタを削除しません。

+0

問題は、ポインタが他のオブジェクトのメンバ変数にあることです。 shared_ptrにすることもできますが、これはこれを行う最も効率的な方法ではないかもしれません。 –

3
bool consistent = count_if(myValues.begin(), myValues.end(), 
    bind2nd(ptr_fun(compare_ptr), *myValues.front())) == myValues.size(); 

int v = consistent ? *myValues.front() : accumulate(
    myValues.begin(), myValues.end(), 0, sum_int_ptr)/myValues.size(); 

for_each(myValues.begin(), myValues.end(), bind1st(ptr_fun(assign_ptr),v)); 

塗りつぶし機能を割り当てる取ることができない(それはポインタデリファレンスなるように)。したがって、for_each()が使用されました。最適化のために、for_each()を実行する前にif(!consistent)を追加することをお勧めします。上記のSTLの1つのライナーで使用されている関数

int sum_int_ptr(int total, int * a) { return total + *a; }  
void assign_ptr(int v, int *ptr) { *ptr = v; }  
bool compare_ptr(int* a, int pattern) { return *a == pattern; } 
+1

ありがとう、私はあなたの返信から多くを学んだ。私はおそらくここでブースト間接イテレータを使うでしょうが、bind1st、bind2ndなどの使い方を知ってうれしいです。 –

+0

ええとSTLは非常に強力です。蓄積するようなこれらの1ライナーをすべて知っておく価値があります。 –

+1

PS:価値ある読書:http://www.keithschwarz.com/cs106l/fall2007/handouts/200_STL_Functional_Library.pdf –

関連する問題