C ++ 2指针使用多集查找总和为特定值的数字对

问题描述

我想使用2指针技术来查找使用c ++多集容器求和成一定值的一对数字。

但是为什么当我的程序中的迭代器l和迭代器r到达同一元素时,while循环不会停止?

int main() {
        multiset<int>st={3,2,1};
        int value =6;
        auto l=st.begin();
        auto r=st.end()--;
      
        while(l!=r){
            if(*l+*r<value){
                L++;
            }
            else if(*l+*r>value){
                r--;        
            }
            else{
                cout<<*l<<" "<<*r<<endl;
                break;
            }
        }
}

当l和r彼此相邻时如何使迭代器停止,并在else条件上添加break,当两者都指向同一元素时,迭代器停止,因此两个迭代器都返回而不是2个不同的数字相同的数字。

解决方法

您需要在else块中添加break;,一旦达到配对,您就不再进行迭代,因此陷入无穷循环...或在else块中移动其中一个迭代器

,

但是为什么当我的程序中的迭代器l和迭代器r到达同一元素时,while循环不会停止?

这是因为并非所有迭代器都是可比较的。迭代器有五种类型:前向,随机访问,双向,输入和输出。只能以您要在程序中进行的方式比较只有输入迭代器。

查看更多信息:http://www.cplusplus.com/reference/iterator/

当l和r彼此相邻时如何使迭代器停止,并在else条件上添加break,当两者都指向同一元素时,迭代器停止,因此两个迭代器都返回而不是2个不同的数字相同的数字。

我认为您应该看看std::distance,它会给您迭代器之间的距离。您将使用它来检测迭代器何时彼此相邻,即距离为1。