结构上的std :: replace_if

时间:2012-11-30 14:39:39

标签: c++ structure std

我想要做的就是在条件满足时替换结构向量上的一个结构域。所以这是我的代码:

struct DataST{
    int S_num,Charge,Duplicate_Nu;
    float PEP;
    string PEPTIDE;
    vector<MZIntensityPair> pairs;
    bool GetByT(const DataST& r,int T)
    {
      switch (T)
      {
          case 1:
            return (S_num == r.S_num);
          case 2:
            return (Charge == r.Charge);
          case 3:
            return !(PEPTIDE.compare(r.PEPTIDE));
          case 4:
            return (Duplicate_Nu == r.Duplicate_Nu);
          case 5:
            return ((S_num == r.S_num)&&(Charge == r.Charge));
          default:
            return false;
      }
    }
  };
int main()
{
 .
 .
 vector<DataST> spectrums;
 .
 .
 DataST tempDT_dup;
 tempDT_dup.PEPTIDE="Test";
 replace_if(spectrums.begin(), spectrums.end(), boost::bind(&DataST::GetByT, _1,tempDT_dup,3),11);
 .
 .
}

因此,在本次考试中,如果该项目的PEPTIDE字段等于“test”,我希望将所有Duplicate_Nu的频谱项目更改为11,但是当我想使用函数GetByT代替操作“=”时我得到了错误

  

/ usr / include / c ++ / 4.6 / bits / stl_algo.h:4985:4:错误:首先在'_ 中与'operator ='不匹配。 _gnu_cxx :: __ normal_iterator&lt; _Iterator, _Container&gt; :: operator * with _Iterator = DataST *,_ _Container = std :: vector,__ gn_cxx :: __ normal_iterator&lt; _Iterator,_Container&gt; :: reference = DataST&amp; = __new_value'   /usr/include/c++/4.6/bits/stl_algo.h:4985:4:注意:候选人是:   hello_pwiz / hello_pwiz.cpp:14:8:注意:DataST&amp; DataST :: operator =(const DataST&amp;)   hello_pwiz / hello_pwiz.cpp:14:8:注意:没有已知的从'int DataST :: * const'到'const DataST&amp;'的参数1的转换

1 个答案:

答案 0 :(得分:4)

到目前为止,问题是您正在尝试通过复制传递不可复制的对象。这是因为您作为boost::bind()的参数提供的任何内容都被复制。

boost::bind(&DataST::GetByT, _1,tempDT_dup,3),
                                 /|\
                                  |
  This means pass by copy. --------

如果您不希望通过副本传递,则需要做的是通过指针传递(复制指针不会造成任何伤害)。或者,您可以使用boost::ref通过引用传递,例如:

boost::bind(&DataST::GetByT, _1,boost::ref(tempDT_dup),3),

另一个问题是您指定11作为std::replace_if()的最后一个参数。它是一个应该替换元素的值(如果谓词返回true)。它应该与存储在数组中的对象(或者可以转换为)相同。但是您无法将11(这是一个普通的有符号整数,即int)转换为DataST类型的对象。你需要这样的东西:

vector<DataST> spectrums;
DataST tempDT_dup;
DataST replacee; // What you want to replace with...
replace_if(spectrums.begin(), spectrums.end(),
           bind(&DataST::GetByT, _1, boost::ref(tempDT_dup), 3),
                replacee);