c++11 std::map 包含大量元素不起作用。此外,我需要使用 upper_bound 函数,但插入函数卡住了

问题描述 投票:0回答:1

好吧,我需要你们的帮助..我正在与 c++11 中的 std::map 作斗争,因为我需要在 for 循环期间存储两个以上的输出。为了更清楚,我应该使用这样的东西:

std::map<std::pair<int, std::pair<long long int, long int>>, std::pair<std::pair<long long int, int>, std::pair<std::string, long int>>> loopMap;

我认为地图本身没有错误,因为 VSCode 没有给我错误,但它没有按预期工作。

我不关心地图顺序,但我需要的是使用

loopMap.upper_bound(long int)
从地图中的最后一个
long int
获取我想要的值。最初,我将这个
long int
放置在地图开始处,但在 for 循环期间插入的值可以重复,因此为了不错过输出,我必须将其移动到地图末尾,并在开头插入一个简单的
int
,可以正常工作作为计数器。

我正在编辑地图以找到使其工作的正确方法,但如果

loopMap.upper_bound(long int)
有效,
loopMap.insert()
会卡住,并且考虑到地图的复杂性,很难用运算符[]来填充。

谢谢你们的帮助。

我的代码:

#include <iostream>
#include <vector>
#include <map>

int main() 
{
   std::map<std::pair<int, std::pair<long long int, long int>>, 
   std::pair<std::pair<long long int, int>, std::pair<std::string, 
   long int>>> loopMap;

   loopMap.insert(std::make_pair(10, std::make_pair(123456789LL, 
   987654321L)), std::make_pair(std::make_pair(123456789LL, 42), 
   std::make_pair("example", 987654321L)));

   if (loopMap.size() > 0)
   {
      auto res = loopMap.upper_bound(2); // I do not know the LL & L int values. So how I can use this?
      std::cout << "The lowest \"int\" is: " << (*res).first << 
      " and its final \"long int\" is:" << (*res).second.second.second << 
      std::endl;
   }

   return 0;
}

我想要的一个例子:

$ The lowest "int" is: 10 and its final "long int" is: 987654321

编译器为 .insert() 给出此错误:

没有重载函数“std::map<_Key, _Tp, _Compare, _Alloc>::insert

”的实例

.upper_bound() 也一样:

没有重载函数“std::map<_Key, _Tp, _Compare, _Alloc>::upper_bound

”的实例
c++ c++11 stdmap
1个回答
0
投票

解决了!

解决方案是将我的地图从

std::map
移动到
std::multimap
以允许 for 循环重复输出。此外,为了使用键,我已经正确修改了映射结构,移动了值字段中的所有未知元素。通过这种方式,我可以简单地将
upper_bound()
与我想要的
long int
值一起使用。

我希望你对我的理解至少有一半。

#include <iostream>
#include <vector>
#include <map>

bool MapLoop()
{
    std::multimap<double, std::pair<std::string, std::pair<long long int, 
    std::pair<int, std::pair<long long int, long int>>>>> txMap;

    double key1 = 0.00842342;
    std::string str = "first_example";
    long long int lli1 = 123456789LL;
    int someInt = 42;
    long long int lli2 = 987654321LL;
    long int li2 = 876543210L;
    double key2 = 0.01000000;

    txMap.insert(std::make_pair(key1, std::make_pair(str, std::make_pair(lli1, std::make_pair(someInt, std::make_pair(lli2, li2))))));
    txMap.insert(std::make_pair(key1, std::make_pair("second_example", std::make_pair(lli1 + 1, std::make_pair(someInt + 1, std::make_pair(lli2 + 1, li2 + 1))))));
    txMap.insert(std::make_pair(key2, std::make_pair("third_example", std::make_pair(lli1 + 2, std::make_pair(someInt + 2, std::make_pair(lli2 + 2, li2 + 2))))));

    std::cout << "txMap size: " << txMap.size() << std::endl;

    for (const auto& it : txMap)
    {
        std::cout << "\"" << it.first << " : " << it.second.first << " => " << it.second.second.first << " : " << it.second.second.second.first << " => " << it.second.second.second.second.first << " : " << it.second.second.second.second.second << "\"" << std::endl;
    }
    
    if (!txMap.empty())
    {
        auto res = txMap.upper_bound(0.00999999);
        std::cout << "The lowest \"double\" is: " << res->first << " and its \"long int\" is: " << res->second.second.second.second.second << std::endl;
        return true;
    }
    
    return false;
}

int main()
{
    if (!MapLoop())
        std::cout << "MapLoop() do not works!" << std::endl;

    return 0;
}

她就是我想要的结果:

txMap size: 3
"0.00842342 : first_example => 123456789 : 42 => 987654321 : 876543210"
"0.00842342 : second_example => 123456790 : 43 => 987654322 : 876543211"
"0.01 : third_example => 123456791 : 44 => 987654323 : 876543212"
The lowest "double" is: 0.01 and its "long int" is: 876543212

正是我一直在寻找的...无论如何,谢谢大家!

© www.soinside.com 2019 - 2024. All rights reserved.