好吧,我需要你们的帮助..我正在与 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
”的实例
解决了!
解决方案是将我的地图从
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
正是我一直在寻找的...无论如何,谢谢大家!