5

のベクトルで要素を見つけるのに少し問題がありshared_ptrます。

これが私が最終的に得たものです:

std::vector<std::shared_ptr<Block>> blocks;

bool contains(Block* block) {
  for (auto i = blocks.begin(); i != blocks.end(); ++i) {
    if ((*i).get() == block) {
      return true;
    }
  }
  return false;
}

std::findしかし、私はそれをやることさえできませんでしたstd::find_if。これを達成するためのよりC++準拠の方法はありますか?

編集:これは私が答えた後のコードです:

bool contains(Block* block) {
  auto found = std::find_if(blocks.begin(), blocks.end(), [block](std::shared_ptr<Block> const& i){
    return i.get() == block;
  });
  return found != blocks.end();
}
4

3 に答える 3

6

試す:

std::find_if(blocks.begin(), blocks.end(), 
  [block](std::shared_ptr<Block> const& i){ return i.get() == block; });
于 2013-02-17T01:45:57.053 に答える
2

さらに簡単:

bool contains(Block* block) {
  return std::any_of(blocks.cbegin(), blocks.cend(),
                     [block](std::shared_ptr<Block> const& i) { return i.get() == block; });
}
于 2016-01-10T18:40:41.660 に答える
1

他の人からの回答とコメントに基づいて、ideoneからの完全に機能するサンプルを次に示します。

#include <vector>
#include <memory>
#include <algorithm>
#include <iostream>

using namespace std;

struct Block
{
    bool in_container(const vector<shared_ptr<Block>>& blocks)
    {
        auto end = blocks.end();
        return end != find_if(blocks.begin(), end,
                              [this](shared_ptr<Block> const& i)
                                  { return i.get() == this; });
    }
};

int main()
{
    auto block1 = make_shared<Block>();
    auto block2 = make_shared<Block>();

    vector<shared_ptr<Block>> blocks;
    blocks.push_back(block1);

    block1->in_container(blocks) ?
        cout << "block1 is in the container\n" :
        cout << "block1 is not in the container\n";

    block2->in_container(blocks) ?
        cout << "block2 is in the container\n" :
        cout << "block2 is not in the container\n";

    return 0;
}

出力は次のとおりです。

block1 is in the container
block2 is not in the container
于 2013-02-17T03:04:03.447 に答える