2

我有一张以时隙为键的地图,指向指定的客户端。并不是所有的时间段都有一个指定的客户端,它可能是一个稀疏和密集的人口,所以我坚持了一个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 的下一个槽。

第 2 部分是我不确定的部分 - 如果 Y 在插槽 480(共 500 个)处引用,并且下一个引用 Y 的插槽是插槽 20(我正在无限循环中遍历插槽号),那么如何我得到它返回20?

我对地图.begin()和“.end()”的理解是它是字面的——即在这种情况下它不会向我返回 20,因为它会到达终点。

4

4 回答 4

0

保留对您最初找到的地方的引用i

如果您到达地图的尽头,但还没有找到您要查找的内容,请返回.start()

于 2013-06-24T07:01:33.277 回答
0

你为什么不在里面再放一个 for 循环呢?

PS:你有while(1),但是出现的break条件在哪里?

 map<int, int> slot_info;

 while (1)
 {
  for (int i = 1; i =< 500; i++)
  {
    map<int, int>::iterator it = slot_info.find(i);

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

        //find the next slot that is assigned to node
        for(map<int, int>::iterator it2 =++it;it2!=slot_info.end();it2++)
          if(it2->second==node)
          {
           //This is the next slot which refers to the same client
          }
    }
  }
 }
于 2013-06-24T07:09:05.627 回答
0
// wrapper that performs a `find_if()` on two ranges, returning
//  an iterator to the first match found.
//
//  If no match is found, `last_2` is returned
template <typename InputIterator, typename Predicate>
InputIterator find_if_in_ranges(
                    InputIterator first_1, InputIterator last_1,
                    InputIterator first_2, InputIterator last_2,
                    Predicate pred)
{
    InputIterator ret = std::find_if( first_1, last_1, pred);

    if (ret == last_1) {
        ret = std::find_if( first_2, last_2, pred);
    }

    return ret;
}

用两个范围调用上面的代码:

  • it + 1slot_info.end()
  • slot_info.begin()it

并传入一个谓词,该谓词比较secondmap<> 迭代器所引用的对的成员。如果您使用 C++03,则可以使用函子或函数指针作为谓词,如果使用 C++11,则可以使用 lambda。

于 2013-06-24T08:18:58.597 回答
0

我不完全清楚 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;
            }
        }
    }
}

但似乎更有可能您可能只想首先遍历地图检查每个值。

您问题的第二部分“我对地图 .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
    }
}
于 2013-06-24T07:12:18.457 回答