C ++通过引用传递整个列表

时间:2013-05-30 19:28:00

标签: c++ list pass-by-reference

我有以下代码:

void endConditionalFlowsBetweenSets(const list<unsigned int>& sourceSet, const     list<unsigned int>& endSet){
    //TODO: Optimize
    //ending previous flows between the two sets
    list<unsigned int>::iterator itS;
    list<unsigned int>::iterator itE;
    for(itS=sourceSet.begin();itS!=sourceSet.end();itS++)
        for(itE=endSet.begin();itE!=endSet.end();itE++)
            if(*itS!=*itE && linkIndex[*itS][*itE].index==-1)   
                endFlow(*itS,*itE);
}

编译后我收到错误:no known conversion for argument 1 from ‘std::list<unsigned int>::const_iterator {aka std::_List_const_iterator<unsigned int>}’ to ‘const std::_List_iterator<unsigned int>&’

为什么?我只是通过引用传递一个列表并创建一个迭代器来迭代它。

5 个答案:

答案 0 :(得分:5)

您应该使用const_iterator

 list<unsigned int>::const_iterator itS;
 list<unsigned int>::const_iterator itE;

答案 1 :(得分:2)

  
    
      

我只是通过引用传递列表

    
  

不,你是通过const引用传递的。您的参数和迭代器之间存在const不匹配。

更改功能签名:

void endConditionalFlowsBetweenSets(
    list<unsigned int>& sourceSet,
    list<unsigned int>& endSet);

或更改迭代器decarations:

 list<unsigned int>::const_iterator itS;
 list<unsigned int>::const_iterator itE;

答案 2 :(得分:1)

您的列表sourceSet是const,但您正在尝试创建非const迭代器。如果你可以这样做,你就可以修改列表,这是不好的,因为列表是const

这就是你应该使用list<unsigned int>::const_iterator

的原因

答案 3 :(得分:0)

您需要使用const_iterator

list<unsigned int>::const_iterator itS;
list<unsigned int>::const_iterator itE;

您正在sourceSet传递const,因此您无法使用非const迭代器。

答案 4 :(得分:0)

如果您只使用auto并让编译器找到合适的类型,那么整个问题永远不会发生:

for(auto itS=sourceSet.begin(); itS!=sourceSet.end(); itS++)
    for(auto itE=endSet.begin(); itE!=endSet.end(); itE++)
        if(*itS!=*itE && linkIndex[*itS][*itE].index==-1)   
            endFlow(*itS,*itE);

您也可以考虑循环范围

for(auto src : sourceSet)   // src is unsigned int
    for(auto&end : endSet)  // end is unsigned int&  allows manipulation in endFlow
        if(src != end && linkIndex[src][end].index==-1)
           endFlow(src,end);