2

如果满足条件,我想要做的只是替换结构向量上的一个结构字段。所以这是我的代码:

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”,我想用 11 更改所有 Duplicate_Nu 光谱项目,但是当我想使用函数 GetByT 而不是操作“=”时出现以下错误

/usr/include/c++/4.6/bits/stl_algo.h:4985:4: 错误:'_ first中的 'operator=' 不匹配。_gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _Iterator = DataST*, _Container = std::vector, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = DataST& = __new_value' /usr/include/c++/ 4.6/bits/stl_algo.h:4985:4: 注意: 候选是: hello_pwiz/hello_pwiz.cpp:14:8: 注意: DataST& DataST::operator=(const DataST&) hello_pwiz/hello_pwiz.cpp:14:8: 注意: 没有已知的参数 1 从 'int DataST::* const' 到 'const DataST&' 的转换</p>

4

1 回答 1

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),

另一个问题是您指定11std::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);
于 2012-11-30T14:45:02.803 回答