gpt4 book ai didi

c++ - 循环到 map 前面

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:56:48 26 4
gpt4 key购买 nike

我有一个以时隙为键的 map ,指向分配的客户。并非所有时隙都有指定的客户,它可能既稀疏又密集,所以我坚持使用 map<int, int>。执行。如果存在分配,则存在键。

计数器从槽 1 计数到槽 x,并在每个槽检查分配。

例如

map<int, int> slot_info;

while (1)
{
for (int i = 1; i =< 500; i++) //iterates through slots - 500 here as an example
{
map<int /*slot*/, int/*node*/>::iterator it = slot_info.find(i);

if (it != slot_info.end())
{
int node = it->second;

//find the next slot that is assigned to node
}
}
}

我需要做以下事情

  1. 在slot X,检查是否存在并分配->如果是,则获取分配的节点Y
  2. 在 X 之后搜索引用 Y 的下一个插槽的 map 。

第 2 部分是我不确定的部分 - 如果 Y 在插槽 480(共 500 个)处引用,并且引用 Y 的下一个插槽是插槽 20(我在无限循环中运行插槽编号),那我怎么让它返回20呢?

我对 map 的理解.begin()和 '.end()` 是它是文字 - 即在这种情况下它不会返回 20 给我,因为它已经到达终点。

最佳答案

我不是很清楚 for(i in 0..500) 是干什么用的,但如果这是你需要做的:

#include <map>
#include <iostream>
#include <algorithm>

using std::map;

int main(int argc, const char** argv)
{
map<int /*time*/, int /*client*/> slot_info;

slot_info[123] = 1;
slot_info[125] = 2;
slot_info[480] = 3;
slot_info[481] = 1;
slot_info[482] = 3;

for (int timeKey = 0; timeKey <= 500; ++timeKey) {
auto it = slot_info.find(timeKey);
if (it != slot_info.end()) {

auto nextIt = ++it;
nextIt = std::find_if(nextIt, slot_info.end(), [=] (const std::pair<int, int>& rhs) { return rhs.second == it->second; });
if (nextIt != slot_info.end()) {
std::cout << "found " << it->second << " with " << it->first << " and " << nextIt->first << std::endl;
}
}
}
}

但您似乎更有可能希望首先遍历 map 以检查每个值。

你的问题的第二部分“我对 map .begin() 和 '.end()` 的理解是它是字面的 - 即在这种情况下它不会返回 20 给我,因为它已经到达终点”

“begin()”和“end()”是绝对值,与您可能拥有的任何当前迭代器无关。

#include <map>
#include <iostream>
#include <algorithm>

using std::map;

std::ostream& operator<<(std::ostream& os, const std::pair<int, int>& item) {
std::cout << "[" << item.first << "," << item.second << "]";
return os;
}

int main(int argc, const char** argv)
{
map<int /*time*/, int /*client*/> slot_info;

slot_info[123] = 1;
slot_info[125] = 2;
slot_info[480] = 3;
slot_info[481] = 1;
slot_info[482] = 3;

for (auto it = slot_info.begin(); it != slot_info.end(); ++it)
{
std::cout << "*it = " << *it << ", but *begin = " << *(slot_info.begin()) << std::endl;
}

return 0;
}

所以你的另一个选择是 - 相当昂贵

for (int timeKey = 0; timeKey <= 500; ++timeKey) {
auto firstIt = slot_info.find(i); // find a slot for this time.
if (firstIt == slot_info.end())
continue;
auto secondIt = std::find(slot_info.begin(), slot_info.end(), [=](const std::pair<int, int>& rhs) { return firstIt->second == rhs.second && firstIt->first != rhs.first; });
if ( secondIt != slot_info.end() ) {
// we found a match
}
}

关于c++ - 循环到 map 前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17269600/

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