我正在使用stl unordered_map,我似乎无法使count方法起作用.这是我的计划:
typedef unordered_map<char, int> Mymap;
int main()
{
Mymap m;
m.insert(Mymap::value_type('a', 1));
m.insert(Mymap::value_type('b', 2));
m.insert(Mymap::value_type('c', 3));
m.insert(Mymap::value_type('b', 4));
m.insert(Mymap::value_type('b', 5));
cout << m.count('b') << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
unordered_map的文档说明了unordered_map::count(const Key& k)返回带键的元素数k.所以我希望这里的输出是3,而真正的输出是1.为什么?
我写了一个程序,它读取输入,直到你点击',' - 输入的COMA.然后它计算你输入的字母数,
我想迭代这个地图,但它说it无法定义,没有类型:
#include <iostream>
#include <conio.h>
#include <ctype.h>
#include <iostream>
#include <string>
#include <tr1/unordered_map>
using namespace std;
int main(){
cout<<"Type '.' when finished typing keys: "<<endl;
char ch;
int n = 128;
std::tr1::unordered_map <char, int> map;
do{
ch = _getch();
cout<<ch;
if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z'){
map[ch] = map[ch] + 1;
}
} while( ch != '.' );
cout<<endl;
for ( auto it = map.begin(); it …Run Code Online (Sandbox Code Playgroud) 我正在使用外部网络库,它返回一些代表打开的套接字的魔术结构,文档说当将它们插入STL容器时,应该使用它们进行比较std::owner_less.
std::map<MagicStructure, std::shared_ptr<Client>, std::owner_less<MagicStructure>> sockets;
Run Code Online (Sandbox Code Playgroud)
不过我想unordered_map改用.我该怎么做?std::owner_less是一个比较器,它对哈希映射没用.挖掘源代码,MagicStructure似乎是一个typedef std::shared_ptr.
我正在编写一个嵌入式应用程序,不幸的是,我使用的环境目前还没有C++ 11支持.
我需要实现一个哈希/无序映射(std::map由于性能原因,常规方法不会这样做),但似乎无法找到干净利落的方法.
如果没有实际引入整个库,Boost不想工作.甚至hash_map来自SGI 的原始STL也需要多个标头,并重复标准库功能,导致模糊的函数调用.这真是一团糟.
为了便于实现,版本控制,质量控制,V&V等,我真的需要利用现有标准库的东西,并且只存在于几个头文件中,我可以将它放在与所有其他源/头文件相同的文件夹中.这样的事情存在,还是我没有希望?我已经搜索了很长一段时间,但空手而归.
非常感谢您的帮助.如果有必要,我当然可以进一步澄清.
与CodeReview 上的这个问题相关,我尝试使用std::unordered_map自定义分配器,但显然这不适用于gcc/clang和libstdc ++.可以通过使用a初始化空哈希映射来生成错误std::allocator
#include <unordered_map>
int main()
{
typedef std::allocator<std::pair<const int, int>> A;
typedef std::unordered_map<int, int, std::hash<int>, std::equal_to<int>, A> H;
auto h = H{A()}; // ERROR, cannot find constructor H::H(const A&)
}
Run Code Online (Sandbox Code Playgroud)
实例.
问题:libstdc ++是否支持std::unordered_map使用单个分配器构造作为参数不完整?
更新:进一步检查表明,对于除了以外的几乎所有容器std::vector,libstdc ++中的分配器的使用直接访问typedef和分配器的成员函数,而不是通过std::allocator_traits.这适用于std::allocator所有自定义分配器但是失败,除非它们直接添加这些成员和typedef.
我张贴了类似的quetion使用在C++ STL地图指针作为键就.当用作Keys时,指针如何在unordered_maps中进行哈希处理.更具体地说,如果我定义:
std::unordered_map< CustomClass*, int > foo;
Run Code Online (Sandbox Code Playgroud)
默认的C++ std :: hash实现是否可以处理这些指针?使用安全吗?这是好习惯吗?
我想存储一对无序整数的浮点值.我无法找到任何易于理解的教程.例如,对于无序对,{i,j}我想存储浮点值f.如何插入,存储和检索这样的值?
我正试图找到一个可能是一个非常微不足道的问题的解决方案.我想const unordered_map在类初始化列表中初始化我.但是我还没有找到编译器(GCC 6.2.0)将接受的语法.代码链接在这里.
#include <unordered_map>
class test {
public:
test()
: map_({23, 1345}, {43, -8745}) {}
private:
const std::unordered_map<long, long> map_;
};
Run Code Online (Sandbox Code Playgroud)
错误:
main.cpp: In constructor 'test::test()':
main.cpp:6:36: error: no matching function for call to 'std::unordered_map<long int, long int>::unordered_map(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'
: map_({23, 1345}, {43, -8745}) {}
^
Run Code Online (Sandbox Code Playgroud)
复制常量是否不允许在初始化列表中初始化?或者语法必须不同?
我有一个Person类,它有一个nameproperty(std::string).
我想创建一个查找表,一个std::unordered_map,所以我可以找到一个Person名字.但是,鉴于a Person,我也希望能够得到他们的名字.
这需要存储name两次 - 一次作为地图的键,一次存储在人物对象内,如下面的代码所示.
由于我有很多Persons一次加载到内存中,我不希望两次存储它们的名称的开销.
我已经尝试在Person类中使用键的引用/指针,但这会产生问题,因为映射似乎在修改时重新调整其数据,并且引用变为无效.
我也尝试过使用std::unordered_set,但这意味着我Person每次想要执行查找时都需要构造一个完整的对象.
是否有任何方法可以使无序映射的键和值共享相同的数据?
#include <iostream>
#include <unordered_map>
class Person
{
private:
const std::string _name;
public:
Person( const std::string& name ) : _name( name )
{
}
const std::string& get_name() const
{
return _name;
}
};
int main()
{
auto my_set = std::unordered_map<std::string, std::shared_ptr<Person>>();
my_set.insert( { "alice", std::shared_ptr<Person>( new Person( "alice" )) } …Run Code Online (Sandbox Code Playgroud) 如果我将 std::unordered_map::reserve 与参数 n 一起使用,只要插入到映射中的元素少于 n 个,插入到映射中是否能保证不会导致堆分配?