【问题标题】:Storing values from a certain range in a map将某个范围内的值存储在地图中
【发布时间】:2017-03-23 22:39:59
【问题描述】:

所以我有一个值图,例如:

 1 3 5 7 9

使用我当前的代码,我目前能够找到 [low, high] 的某个范围之间的出现次数。例如,如果我有 [3, 7] 我会得到值 3。

我当前的代码如下所示:

 // map::lower_bound/upper_bound
 #include <iostream>
 #include <map>
 using namespace std;

 int main ()
 {
   map<long,deque<my_struct>> my_map;
   deque<my_struct> results;

   mymap[12345].push_back(some_obj);
   mymap[23456].push_back(some_obj);
   mymap[34567].push_back(some_obj);
   mymap[45678].push_back(some_obj);

   auto low = my_map.lower_bound (12345);  
   auto high = my_map.upper_bound (34567);  

   int num = 0;
   for (auto it = low; it != high; ++it){
        ++num;
        //how to insert into my results deque? 
    }
    cout << num << " found\n"; //3found
   return 0;
 }

我的问题是:我如何获得此示例中存在于低和高之间的 3 个对象?我想将这 3 个对象存储在“结果”双端队列中,这样我就知道在该特定范围内找到了什么 3。我知道我想推入 my-struct 的 3 个对象,但我很难弄清楚语法。任何提示或帮助将不胜感激!

编辑:尝试使用新方法

 using namespace std;

 struct my_struct{
     string value;
 };

 int main ()
 {
     map<long,deque<my_struct>> my_map;
     deque<my_struct> results;

my_struct entrya;
entrya.value = "today is a great day";

my_struct entryb;
entryb.value = "today is an okay day";

my_struct entryc;
entryc.value = "today is a bad day";


my_map[12345].push_back(entrya);
my_map[23456].push_back(entryb);
my_map[34567].push_back(entryc);


auto low = my_map.lower_bound (12345);
auto high = my_map.upper_bound (34567);

int num = 0;
for (auto it = low; it != high; ++it){
    ++num;
    results.insert(results.back(), it->second.begin(), it->second.end());
    //how to insert into my results deque?
}
cout << num << " found\n"; //3found

cout << "testing results\n";
for (int i = 0; i < results.size(); i++){
    cout << results[i].value << "\n";
}
return 0;

}

编辑:图片版https://gyazo.com/4960e067252f23ffafb924fa8e6693eb

【问题讨论】:

    标签: c++ dictionary hash mapping


    【解决方案1】:

    lower_boundupper_bound 函数返回一个映射迭代器,所以您真正要问的是如何通过迭代器访问存储在映射中的对象。

    map 的迭代器指向std::pair,其中第一个元素是键,第二个元素是值。因此,要获取存储的值,请使用 it-&gt;second

    由于映射中的值类型实际上是std::deque&lt;my_struct&gt;,大概你想将所有数据连接到单个双端队列results。您可以使用std::deque::insert 函数执行此操作,如下所示:

    //how to insert into my results deque?
    results.insert( result.end(), it->second.begin(), it->second.end() );
    

    【讨论】:

    • 哦,谢谢指正。看代码示例的时候有点懒。
    • 大家好,我在使用@1201ProgramAlarm 的方法时仍然遇到了一些问题。我想知道你是否还能帮忙。该功能很有意义,我在STL上查找了它。然而 Xcode 仍然拒绝编译。我把它放在主帖的编辑中。你知道为什么它仍然会失败吗?
    • 是的,原来的评论误用了results.back(),而不是results.end()。我已经相应地编辑了我的答案。
    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2022-01-18
    • 2017-10-10
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多