我知道标准没有规定必须实现STL容器的方式,而是规定了每个容器的一组要求.
然而,众所周知,STL有序容器通常被实现为红黑树.
您可以使用各自的迭代器迭代a std::set或a 的元素std::map,或者使用ranged循环来迭代C++ 11.
然而令我困惑的是,STL中一个有序的容器如何"知道"它的"结束".或者换句话说,因为它们是作为树实现的,如何实现容器的结束还是可以实现?
我知道标准规定§23.2.1/ c一般容器要求(强调矿井):
begin()返回一个引用容器中第一个元素的迭代器.end()返回一个迭代器,它是容器的past-the-end值.如果容器为空,则begin()== end();
好吧,对于连续的容器来说这很容易,但这种"过去的结果"如何实现树木?
有谁知道我在哪里可以找到包装a std::map并使其线程安全的implimentation ?当我说线程安全时,我的意思是它只提供对地图的串行访问,一次一个线程.最理想的是,此映射应仅使用标准库和/或boost构造.
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时,它给了我一个编译错误.为什么?谢谢!
所以,我对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) 考虑以下代码:
std::unordered_map<int, std::string> data;
data[5] = foo();
Run Code Online (Sandbox Code Playgroud)
按照什么顺序data[5]和foo()处理?如果foo()抛出异常,是否创建了5项目data?
如果行为取决于C++的版本,那些版本有何不同?
鉴于我有两个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.使用标准库有一种干净的方式吗?
我无法弄清楚这一点.创建两个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,null和NULL作为VAL,没有工作,因为他们都是int类型,G ++抱怨的.这里使用的默认值是什么?
或者这种事情不是一个好主意?
我可能需要更多地重新考虑我的整体设计,但就目前而言,看起来我可能想做类似的事情:
class A;
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;
Run Code Online (Sandbox Code Playgroud)
我试过这个,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作).但我对这种方法有了第二个想法.我怀疑那里有一些我不知道的陷阱.
那么,上述实际意义上的有效吗?或者,当我这样做时,我不知道有什么缺陷吗?
我正在使用没有任何复制操作符的Class(Object):它现在基本上无法复制.我有一个
std::map<int,Object> objects
列出具有int标识符的对象的变量.如何在不使用复制运算符的情况下将Object添加到此映射中?我试过了
objects.insert(std::pair<0,Object()>);
但那不会编译.我想最初使用默认构造函数在地图内部创建我的对象,但是写作
objects[0]; 失败...谢谢:)
鉴于代码:
class Foo {
std::vector<int> items;
std::map<int, int> dictionary;
};
Run Code Online (Sandbox Code Playgroud)
如果没有任何东西被添加到上面的矢量或地图中,还是会分配一块缓冲存储器吗?(换句话说,缓冲区分配总是在容器创建期间发生,还是可以在调用push_back之类的函数之前推迟?)
是否存在处理初始STL容器缓冲区分配时间的标准,或者是否允许STL容器和编译器之间的行为不同?
注意:这个问题不是关于这样的容器会增加类Foo大小的额外字节.
(这个问题的一个相关子集强调分配大小是C++中向量的初始容量.)
c++ ×10
stdmap ×10
dictionary ×3
stl ×3
c++11 ×2
constructor ×2
allocation ×1
collections ×1
containers ×1
lambda ×1
shared-ptr ×1
std ×1
stdset ×1
stdvector ×1