gpt4 book ai didi

c++ - 以 map 作为参数的函数不起作用

转载 作者:行者123 更新时间:2023-11-28 04:29:25 24 4
gpt4 key购买 nike

出于某种原因,我的程序中以 map 作为参数的所有函数都无法正常工作。这个函数是调用所有这些函数的函数(pageAndTimestamp 是一个结构 btw):

void fifo(int framesize, int numref, int* pagestream)
{
double hit = 0, size = numref;

map<int, pageAndTimestamp> frames = frameMaker(framesize);

for (int time = 0; time < numref; time++)
{
if (pageLoaded(pagestream[time], frames))
{
hit++;
output(time, pagestream[time], size, hit, frames);
}
else
{
int loc = findPageToReplace(frames);
replacePage(loc, pagestream[time], time, frames);
output(time, pagestream[time], size, hit, frames);
}
}
}

这些是无法正常工作的功能:

bool pageLoaded(int page, map<int, pageAndTimestamp> m)
{
for (const auto& it : m)
{
if (it.second.a[0] == page)
return true;
}
return false;
}

int findPageToReplace(map<int, pageAndTimestamp> m)
{
int timestamp = INT_MAX;
int replaceLoc = 0;
for (const auto& it : m)
{
if (it.second.a[1] == -1)
return it.first;
else
{
if (it.second.a[1] < timestamp)
{
timestamp = it.second.a[1];
replaceLoc = it.first;
}
}
}
return replaceLoc;
}

void replacePage(int loc, int page, int time, map<int, pageAndTimestamp> m)
{
m.at(loc).a[0] = page;
m.at(loc).a[1] = time;
}

void output(int t, int p, double s, double h, map<int, pageAndTimestamp> m)
{
cout << "Time: " << t << endl << "Page: " << p << endl;
for(const auto& it : m)
cout << "Frame" << it.first << ": " << it.second.a[0] << endl;
cout << "Hit ratio: " << h << " / " << s << " (" << h / s << ")" << endl
<< endl << endl;
}

当我在 Visual Studio 2017 调试器中运行程序时,当我进入上述任何函数时,调试器会将我带到 map 标准 header 中的这个函数 header :

map(const map& _Right)
: _Mybase(_Right, _Alnode_traits::select_on_container_copy_construction(_Right._Getal()))
{ // construct map by copying _Right
}

我不知道问题出在哪里,或者为什么调试器将我带到这个函数头。我该如何解决这个问题?

最佳答案

例如函数replacePage,定义为:

void replacePage(int loc, int page, int time, map<int, pageAndTimestamp> m)

此函数将 map 作为,而不是引用或指针。因此,当您按如下方式调用它时:

replacePage(loc, pagestream[time], time, frames);

然后 map frames复制到您函数中的变量 m 中。例如,这就是调试器将您带到 map 的复制构造函数的原因。

进一步来说,就是说replacePage代码

  m.at(loc).a[0] = page;
m.at(loc).a[1] = time;

正在对 frames拷贝 进行更改,而不是 frames 本身。

您可能需要具有以下形式签名的函数:

bool pageLoaded(int page, const map<int, pageAndTimestamp>& m)
int findPageToReplace(const map<int, pageAndTimestamp>& m)
void replacePage(int loc, int page, int time, map<int, pageAndTimestamp>& m)
void output(int t, int p, double s, double h, const map<int, pageAndTimestamp>& m)

其中大多数函数采用常量引用,而 replacePage 需要(非常量)引用。

关于c++ - 以 map 作为参数的函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53311719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com