c++实现opt算法


#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
using namespace std;

bool Find(set<int> page,int number)
{
    bool flag;
    if(page.find(number) == page.end())
    {
        flag = true;
    }
    else
    {
        flag = false;
    }
    return flag;
}

void OPT(vector<int> example,int size)
{
    int Break = 0; //缺页次数
    set<int> page;
    multimap<int,int>number;
    int max;
    for(int i = 0; i < int(example.size()); i++)
    {
        if(int(page.size()) < size && Find(page,example[i]))
        {
            page.insert(example[i]);
            Break++;
            cout << Break << endl;
        }
        else
        {
            if(Find(page,example[i]))
                {for(int t = 0; t < int(example.size() - i); t++ )
                {
                    number.insert(make_pair(example[i],t));
                }
            
                for(auto it = page.begin();it != page.end();it++)
                {
                    max = (((number.find(*it))->second) > ((number.find(*(++it)))->second)) ? ((number.find(*it))->second) : ((number.find(*(++it)))->second);
                }
                page.erase(example[max + i]);
                page.insert(example[i]);
                Break++;
                number.clear();
            }
        }
        
    }
                
    
}

int main()
{
    vector<int> example{7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
    OPT(example,3);
    return 0;
}

这是我写的opt算法,但是运行时会卡住,不知道出了什么问题

根据你给的代码,可以尝试改两处试试有没有效果
1.循环的条件:将你的循环条件修改为 i < example.size()-1 可以避免最后一个元素发生越界
2.‘it’自增迭代器,有几率会造成迭代器失效;可以试着改用‘std::next()’来获取下个迭代器

```c++
    for (int i = 0; i < example.size()-1; i++)
    {
      ……
    }


```c++
……
max = ((number.find(*it))->second > (number.find(*std::next(it)))->second) ? (number.find(*it))->second : (number.find(*std::next(it)))->second;
……

希望能帮到你,加油~~~