2

以下の最初のコード スニペットでは、std::remove_if 関数に供給される静的条件関数に基づいて、メンバー関数内のベクトルから要素を削除しようとしています。ここでの問題は、条件関数内で removeVipAddress メソッドの入力パラメーター uuid にアクセスできないことです。uuid という名前の入力パラメーターに基づいてベクターからアイテムを削除できるようにするには、ここで何をすべきだと思いますか? ありがとう。注: これは、前にstd:: ベクターから項目を削除するで説明したフォロー アップの問題です。

スニペット 1 (コード)

void removeVipAddress(std::string &uuid)
{
          struct RemoveCond
          {
            static bool condition(const VipAddressEntity & o)
            {
              return o.getUUID() == uuid;
            }
          };

          std::vector<VipAddressEntity>::iterator last =
            std::remove_if(
                    mVipAddressList.begin(),
                    mVipAddressList.end(),
                    RemoveCond::condition);

          mVipAddressList.erase(last, mVipAddressList.end());

}

スニペット 2 (コンパイル出力)

 $ g++ -g -c -std=c++11 -Wall Entity.hpp
 Entity.hpp: In static member function ‘static bool ECLBCP::VipAddressSet::removeVipAddress(std::string&)::RemoveCond::condition(const   ECLBCP::VipAddressEntity&)’:
 Entity.hpp:203:32: error: use of parameter from containing function
 Entity.hpp:197:7: error:   ‘std::string& uuid’ declared here
4

2 に答える 2

2

C++11 を使用している場合、これはラムダで実行できます。

auto last = std::remove_if(
     mVipAddressList.begin(),
     mVipAddressList.end(),
     [uuid]( const VipAddressEntity& o ){
          return o.getUUID() == uuid;
     });

その関数呼び出しの最後のパラメーターは、無名のインライン関数であるラムダを宣言します。ビットは、ラムダのスコープ[uuid]に含めるように指示します。uuid

ここにラムダに関するチュートリアルがあります

あるいは、RemoveCond 述語にコンストラクターとメンバー関数を提供することをお勧めします (そして、condition という名前の関数ではなく、operator() を使用して実装します)。

このようなもの:

struct RemoveCond
{
    RemoveCond( const std::string& uuid ) :
    m_uuid( uuid )
    {
    }

    bool operator()(const VipAddressEntity & o)
    {
        return o.getUUID() == m_uuid;
    }

    const std::string& m_uuid;
};

std::remove_if( 
     mVipAddressList.begin(),
     mVipAddressList.end(),
     RemoveCond( uuid );
     );
于 2013-02-22T13:30:57.750 に答える
1

C++11 ラムダがない場合はRemoveCond、ファンクターとして表現できます。

struct RemoveCond
{
  RemoveCond(const std::string uuid) : uuid_(uuid) {}
  bool operator()(const VipAddressEntity & o) const
  {
          return o.getUUID() == uuid_;
  }
  const std::string& uuid_;
};

次に、インスタンスをに渡しますstd::remove_if

std::remove_if(mVipAddressList.begin(),
               mVipAddressList.end(),
               RemoveCond(uuid));

ところで、removeVipAddress関数は参照を取る必要がありconstます:

void removeVipAddress(const std::string &uuid)
于 2013-02-22T13:38:10.460 に答える