标签: stdmap

STL如何订购容器知道他们的结局?

我知道标准没有规定必须实现STL容器的方式,而是规定了每个容器的一组要求.

然而,众所周知,STL有序容器通常被实现为红黑树.

您可以使用各自的迭代器迭代a std::set或a 的元素std::map,或者使用ranged循环来迭代C++ 11.

然而令我困惑的是,STL中一个有序的容器如何"知道"它的"结束".或者换句话说,因为它们是作为树实现的,如何实现容器的结束还是可以实现?

我知道标准规定§23.2.1/ c一般容器要求(强调矿井):

begin()返回一个引用容器中第一个元素的迭代器.end()返回一个迭代器,它是容器的past-the-end值.如果容器为空,则begin()== end();

好吧,对于连续的容器来说这很容易,但这种"过去的结果"如何实现树木?

c++ stl stdmap stdset c++11

15
推荐指数
2
解决办法
303
查看次数

C++线程安全映射

有谁知道我在哪里可以找到包装a std::map并使其线程安全的implimentation ?当我说线程安全时,我的意思是它只提供对地图的串行访问,一次一个线程.最理想的是,此映射应仅使用标准库和/或boost构造.

c++ collections dictionary stdmap thread-safety

14
推荐指数
1
解决办法
2万
查看次数

是不是可以在结构中使用stl map?

struct Node
{
  int a;
  int b;
};

Node node;
node.a = 2;
node.b = 3;

map<int, int> aa;
aa[1]=1; // OK.

map<Node, int> bb;
bb[node]=1; // Compile error.
Run Code Online (Sandbox Code Playgroud)

当我尝试将结构映射到int时,它给了我一个编译错误.为什么?谢谢!

c++ containers dictionary stl stdmap

14
推荐指数
3
解决办法
2万
查看次数

map,lambda,remove_if

所以,我对std :: map,lambda和stl算法(remove_if)有疑问.实际上,与std :: list或std :: vector相同的代码运行良好.

我的测试示例:

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

struct Foo
{
    Foo() : _id(0) {}
    Foo(int id) : _id(id)
    {

    }

    int _id;    
};
typedef std::map<int, Foo> FooMap;


int main()
{
    FooMap m;
    for (int i = 0; i < 10; ++i)
        m[i + 100] = Foo(i);

    int removeId = 6;
    // <<< Error here >>>
    std::remove_if(m.begin(), m.end(), [=](const FooMap::value_type & item) { return item.second._id == removeId ;} ); 

    for (auto & item : …
Run Code Online (Sandbox Code Playgroud)

c++ lambda stdmap stl-algorithm c++11

14
推荐指数
1
解决办法
1万
查看次数

首先处理赋值表达式的哪一侧?

考虑以下代码:

std::unordered_map<int, std::string> data;
data[5] = foo();
Run Code Online (Sandbox Code Playgroud)

按照什么顺序data[5]foo()处理?如果foo()抛出异常,是否创建了5项目data

如果行为取决于C++的版本,那些版本有何不同?

c++ exception-handling stdmap

14
推荐指数
0
解决办法
282
查看次数

两个`std :: map`s的交叉点

鉴于我有两个std::map,说:

map<int, double> A;
map<int, double> B;
Run Code Online (Sandbox Code Playgroud)

我想得到两张地图的交集,形式如下:

map<int, pair<double,double> > C;
Run Code Online (Sandbox Code Playgroud)

其中键是两者 中的值,A并且B值是分别来自A和的一对值B.使用标准库有一种干净的方式吗?

c++ dictionary stdmap std c++-standard-library

13
推荐指数
3
解决办法
9214
查看次数

如何将std :: map作为默认构造函数参数传递

我无法弄清楚这一点.创建两个ctors很容易,但我想知道是否有一个简单的方法来做到这一点.

如何将a std::map作为默认参数传递给ctor,例如

Foo::Foo( int arg1, int arg2, const std::map<std::string, std::string> = VAL)
Run Code Online (Sandbox Code Playgroud)

我试过0,nullNULL作为VAL,没有工作,因为他们都是int类型,G ++抱怨的.这里使用的默认值是什么?

或者这种事情不是一个好主意?

c++ constructor stdmap default-value

13
推荐指数
3
解决办法
9852
查看次数

你可以使用boost :: shared_ptr作为地图的关键吗?

我可能需要更多地重新考虑我的整体设计,但就目前而言,看起来我可能想做类似的事情:

class A; 
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;
Run Code Online (Sandbox Code Playgroud)

我试过这个,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作).但我对这种方法有了第二个想法.我怀疑那里有一些我不知道的陷阱.

那么,上述实际意义上的有效吗?或者,当我这样做时,我不知道有什么缺陷吗?

c++ stdmap shared-ptr

13
推荐指数
1
解决办法
4332
查看次数

是否可以在没有任何复制操作符的类中使用C++中的std :: map?

我正在使用没有任何复制操作符的Class(Object):它现在基本上无法复制.我有一个

std::map<int,Object> objects

列出具有int标识符的对象的变量.如何在不使用复制运算符的情况下将Object添加到此映射中?我试过了

objects.insert(std::pair<0,Object()>);

但那不会编译.我想最初使用默认构造函数在地图内部创建我的对象,但是写作

objects[0]; 失败...谢谢:)

c++ constructor stdmap copy-constructor

13
推荐指数
2
解决办法
1万
查看次数

未使用的STL容器是否分配内存?

鉴于代码:

class Foo {
  std::vector<int> items;
  std::map<int, int> dictionary;
};
Run Code Online (Sandbox Code Playgroud)
  1. 如果没有任何东西被添加到上面的矢量或地图中,还是会分配一块缓冲存储器吗?(换句话说,缓冲区分配总是在容器创建期间发生,还是可以在调用push_back之类的函数之前推迟?)

  2. 是否存在处理初始STL容器缓冲区分配时间的标准,或者是否允许STL容器和编译器之间的行为不同?

注意:这个问题不是关于这样的容器会增加类Foo大小的额外字节.

(这个问题的一个相关子集强调分配大小是C++中向量的初始容量.)

c++ stl allocation stdmap stdvector

13
推荐指数
2
解决办法
1551
查看次数