标签: stdmap

如何在std :: map中使用struct?

我有一个复杂的结构,我希望将其作为std :: map的一个关键字来快速生成所有唯一对象的列表:

union somecomplexstruct {
     struct {
        more_structs val1, val2;
        even_more_structs val3, val4;
        lots_of_more_structs val5;
     };
     unsigned int DATA[3];
};

typedef map<somecomplexstruct, int, greater<somecomplexstruct> > somecomplexstructMap;
Run Code Online (Sandbox Code Playgroud)

但它说错误: error C2784: 'bool std::operator >(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'const somecomplexstruct'

我如何使我的结构在那里工作?

编辑:得到它的工作,感谢大家!下面是代码:

inline bool operator>(const somecomplexstruct &v1, const somecomplexstruct &v2){
    if(v1.DATA[0] > v2.DATA[0]) return 1;
    if(v1.DATA[0] < v2.DATA[0]) return 0;
    if(v1.DATA[1] > v2.DATA[1]) return 1;
    if(v1.DATA[1] < v2.DATA[1]) return …
Run Code Online (Sandbox Code Playgroud)

c++ stl stdmap

4
推荐指数
1
解决办法
1764
查看次数

在关联容器中使用emplace(args && ...)

我试图转发一些参数来进行对象的原位构造.我不太了解在关联容器中使用emplace背后的基本原理,或者我可能只是以错误的方式使用/思考.如果有人可以共享代码片段以供使用,那将会很棒.

像map这样的关联容器总是存储一个kind对()的对象,而emplace函数表示它会通过转发参数来调用存储的对象的构造函数(对于map的情况总是成对).那么即使函数具有可变参数签名,我们是否仅限于提供两个参数(键,值)?

当我使用增强容器的emplace之前我可以传递如下的参数:emplace(arg1,arg2,arg3,arg4)//其中arg2,arg3,arg4用于构造对象而arg 1是关键.

当用新的gcc-4.6和c ++ 11编译时,这会打破但现在我必须做类似的事情:emplace(arg1,myobj(arg2,arg3,arg4)); //使相同的代码工作;

所以新的安卓不会像升级那样做任何明智的结构吗?我是否限制只为地图提供2个参数,因为对将始终为其构造函数接受两个参数.

c++ stdmap variadic-templates c++11 std-pair

4
推荐指数
2
解决办法
1388
查看次数

使用对作为关键字迭代地图

我有一个映射,其中pair作为键,第三个整数作为值.我想知道如何迭代键.示例代码粘贴在下面.

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

using namespace std;

int main ()
{
  map <pair<int, int>, int> my_map;
  pair <int, int> my_pair;

  my_pair = make_pair(1, 2);
  my_map[my_pair] = 3;

  // My attempt on iteration
  for(map<pair<int,int>,int>::iterator it = my_map.begin(); it != my_map.end(); ++it) {
    cout << it->first << "\n";
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ dictionary iterator stdmap output

4
推荐指数
2
解决办法
5058
查看次数

为什么我可以在main()之前通过std :: map填充变量?

我在一个旧程序中偶然发现了一些奇怪的行为,并弄清楚为什么G ++和CLang ++允许它发生.我在main()之前声明并初始化了一些全局变量.奇怪的是它们是通过静态std :: map初始化的,它使用下标运算符同时填充.一旦main()运行,一切似乎都在正确的位置,地图的大小显示正确的填充项数以及包含main()之前显示的值的变量.

#include <map>
#include <iostream>

static std::map<int, const char*> staticMap;

const char* const a = staticMap[0] = []()->const char* {return "a";}();
const char* const b = staticMap[1] = []()->const char* {return "b";}();
const char* const c = staticMap[2] = []()->const char* {return "c";}();
const char* const d = staticMap[3] = []()->const char* {return "d";}();
const char* const e = staticMap[4] = []()->const char* {return "e";}();

int main() {
    std::cout << "# Items: " << staticMap.size() << …
Run Code Online (Sandbox Code Playgroud)

c++ initialization stdmap undefined-behavior c++11

4
推荐指数
1
解决办法
287
查看次数

如何在值为 std::set(从某物映射到集合)的 std::map 中使用 emplace()?

问题

我有一个std::map<int, std::set<int>>名为misi. 我想知道为什么misi.emplace(2345, {6, 9});并且misi.emplace({2345, {6, 9}});没有按预期工作,如下所示。

编码

#include <set>          // std:set
#include <map>          // std::map
#include <utility>      // std::piecewise_construct, std::pair
#include <tuple>        // std::forward_as_tuple
#include <iostream>     // std::cout, std::endl

int main()
{
    // --- std::set initializer list constructor ---
    std::set<int> si({42, 16});
    std::cout << "si.size(): " << si.size() << std::endl;       // 2
    std::cout << "*si.begin(): " << *si.begin() << std::endl;   // 16

    // --- std::set emplace() ---
    si.emplace(7);
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap stdset c++11 emplace

4
推荐指数
1
解决办法
2237
查看次数

c ++ std::map 获取最高键低于 X 的元素?

给定一个键是整数的 C++ 映射(或多映射),是否可以使用 STL 请求键是给定数字以下最大数字的元素范围?

所以如果我有:

map = {{1,'x'}, {2, 'g'}, {3, 'n'}, {3, 'm'}, {4, 'z'}, {5, 'a'}}
Run Code Online (Sandbox Code Playgroud)

我想在 4 之前找到元素,它会返回:

{{3, 'n'}, {3, 'm'}}
Run Code Online (Sandbox Code Playgroud)

(我更感兴趣,std::map但也保留了一般问题std::multimap)。

c++ stl stdmap c++11

4
推荐指数
2
解决办法
1422
查看次数

从另一个const std :: map初始化const std :: map的一部分

我有一个const std :: map <int,std :: string>初始化如下:

const std::map< int, std::string > firstMap = {
    { 1, "First" },
    { 2, "Second"}
};
Run Code Online (Sandbox Code Playgroud)

然后我想制作另一个const std :: map,它使用第一个映射作为其初始值的一部分,并且还扩展了原始数据.所以我想这会是类似的东西:

const std::map< int, std::string > secondMap = {
    { <firstMap>},
    { 3, "Third"}
};
Run Code Online (Sandbox Code Playgroud)

这样第二个映射就有三对.这可能吗?

编辑:这些地图也被宣布为extern.

c++ initialization stdmap c++11

4
推荐指数
2
解决办法
71
查看次数

std :: map :: const_iterator泄漏非const引用值?

我观察到std :: map :: const_iterator泄漏了对value_type的非const引用:

#include <map>
#include <stdio.h>

int main (int argc, char *argv[])
{
  std::map<int,int> foo = {{1,1},{4,2}};
  const auto &m = foo;
  const auto &it = foo.find(1);
  printf("%d %d\n", it->first, it->second);
  int &i = it->second;
  i = 3;
  auto &one = foo.at(1);
  printf("%d %d\n", 1, one);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出

$ g++ test.cc && ./a.out 
1 1
1 3
Run Code Online (Sandbox Code Playgroud)

这是预期的吗?为什么?编写std :: map的const-protection的唯一方法是将它包装在另一个类中吗?

c++ stdmap c++11

4
推荐指数
1
解决办法
151
查看次数

通过emplace()将对象指针插入到地图的地图中不起作用

我正在尝试将指针对象插入到map通过emplace()但它不起作用.

我在下面创建了一个简单的问题表示.我正在尝试插入newFooList指针对象类型Foo*.

我似乎找不到为FooMap*in 创建类型的方法std::map<int, FooMap*> m_fooMapList.是否应该使用new地图的第二个字段?

#include <iostream>
#include <utility>
#include <stdint.h>
#include <cstdlib>
#include <map>

class Foo
{
    private:
        int m_foobar;
    public:
        Foo(int value)
        {
            m_foobar = value;
        }
        void setfoobar(int value);
        int getfoobar();
};

class FooMap
{
    private:
        std::map<int, Foo*> m_newFoo;

    public:
        FooMap() = default;
};

class FooMapList
{
    private:
        std::map<int, FooMap*> m_fooMapList;
    public:
        FooMapList() = default;
        void insertFoo(Foo* newFooObj);
};

int Foo::getfoobar(void)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ pointers stdmap c++11 emplace

4
推荐指数
1
解决办法
505
查看次数

std::forward_as__tuple 的用例

Cppreference 给出std::forward_as_tuple了以下示例(请参见此处

#include <iostream>
#include <map>
#include <tuple>
#include <string>

int main()
{
     std::map<int, std::string> m;

     m.emplace(std::piecewise_construct,
               std::forward_as_tuple(10),
               std::forward_as_tuple(20, 'a'));
     std::cout << "m[10] = " << m[10] << '\n';

     // The following is an error: it produces a
     // std::tuple<int&&, char&&> holding two dangling references.
     //
     // auto t = std::forward_as_tuple(20, 'a');
     // m.emplace(std::piecewise_construct, std::forward_as_tuple(10), t);
}
Run Code Online (Sandbox Code Playgroud)

简单写有什么好处

 m.emplace(std::make_pair(20,std::string(20,'a')));
Run Code Online (Sandbox Code Playgroud)

c++ stdmap std c++11

4
推荐指数
1
解决办法
211
查看次数