在我们的应用程序中,我们使用std::map存储(键,值)数据并使用序列化将该数据存储在磁盘上.通过这种方法,我们发现磁盘I/O是性能瓶颈,使用密钥查找值不是很快.
我遇到了LevelDB并且正在考虑使用它.但我有一些问题.
std::map和LevelDB 之间的区别在于LevelDB是持久的并且std::map在内存中工作.这是否意味着磁盘I/O瓶颈对于levelDB来说会更成问题.更具体地说,任何人都可以解释一下LevelDB是否可能是更好的选择std::map?
PS:我尝试使用hash_maps但它看起来比较慢std::map
是否可以使用STL算法将std :: map值深度复制到std :: set?
我不想在新集中明确插入.
我不希望明确这样做:
std::map<int, double*> myMap; //filled with something
std::set<double*> mySet;
for (std::map<int, double*>::iterator iter = myMap.begin(); iter!=myMap.end(); ++iter)
{
mySet.insert(iter->second);
}
Run Code Online (Sandbox Code Playgroud)
但是要找到一种更加巧妙和优雅的方式来做到这一点,并带有深刻的价值观.
问题很简单:我们有一个有成员a,b,c,d的类...我们希望能够快速搜索(键是一个成员的值)并通过提供当前值来更新具有新值的类列表或者b或c ......我想过要一堆
std::map<decltype(MyClass.a/*b,c,d*/),shared_ptr<MyClass>>.
1)这是个好主意吗?
2)boost multi index在各方面都优于这个手工解决方案吗?
出于简单/性能原因,PS SQL是不可能的.
我正在开发一个多线程应用程序,每个线程将从一组地图和向量中读取(不会修改结构).任何人都可以建议,因为线程只是从这些结构中读取,是否有必要在读取这些结构的代码块周围实现可共享的互斥锁?
说我有以下代码:
typedef std::map< int, std::string >::iterator Iterator;
Iterator iter = myMap.begin();
while (iter != myMap.end())
{
Iterator current = iter;
++iter;
maybeDeleteElement( current ) // may call erase.
}
Run Code Online (Sandbox Code Playgroud)
鉴于它std::map是作为红黑树实现的,是否保证地图中的每个元素都只被访问一次?或者修改地图会导致树重新平衡,从而改变迭代序列?
注意:这不是关于任何迭代器是否将被无效的问题.但是迭代器仍然有效并不一定意味着递增它将为您提供与之前相同的下一个元素.
尝试std::map在Ubuntu 12.04上使用clang-3.3和clang-3.0 时遇到问题:
#include <iostream>
#include <map>
#include <string>
class A
{
public:
#if 0 //clang compiles ok
typedef std::map<std::string,std::string> MapKeyValue_t;
void PrintMap(const MapKeyValue_t &my_map
= MapKeyValue_t())
#else // clang compiles fail
void PrintMap(const std::map<std::string,std::string> &my_map
= std::map<std::string,std::string>())
#endif
{
std::map<std::string,std::string>::const_iterator it;
for (it = my_map.begin(); it != my_map.end(); it++)
{
std::cout << it->first << " " << it->second << std::endl;
}
}
};
int main()
{
A a;
a.PrintMap();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,当代码编译在这两个g++和clang我不断收到这些错误的输出: …
假设我有一个std::map<std::string, T>(或unordered_map),我想从迭代器/引用/指向内容的指针访问密钥.
有没有办法做到这一点,没有std::string密钥的两个副本(一个由地图拥有,一个在内容对象内)?一个人可以参考另一个吗?
我的问题如下:我想将两个(不多)不同的数据类型作为值放入映射中.
typeX A, B, ...;
typeY Z, Y, ...;
void func (typeX) { ... }
void func (typeY) { ... }
std::map <std::string, what_to_put_here??> map;
map["a"] = A;
map["z"] = Z;
...
std::vector<std::string> list;
// This list will be something like "a", "y", ...
for (unsigned int i = 0; i < list.size(); ++i)
func( map[list[i]] )
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,因为地图只接受一种数据类型的值.当循环"list"时,对"func"的调用应该是明确的,因为map [list [i]]的类型是已知的.
我想避免显式转换或类型检查,即......
if (typeid( map[list[i]] ).name() == "typeX")
func( map[list[i]] )
else if (typeid( map[list[i]] ).name() == "typeY")
func( map[list[i]] ) …Run Code Online (Sandbox Code Playgroud) 此应用程序正在使用C++在Windows XP上的VS2010中开发.
当计算机在物理内存上运行时非常低(并且因为它是我们的测试用例而禁用了页面文件),这行代码:
std::map<UINT, std::vector<void *>> MyMap;
在malloc.c中导致"堆栈溢出"错误
'return HeapAlloc(_crtheap, 0, size ? size : 1);'
Run Code Online (Sandbox Code Playgroud)
MyApp.exe中0x7c90e8e5处的未处理异常:0xC00000FD:堆栈溢出.
此调用是从应用程序的一个线程进行的.如果内存不足是错误,它应该抛出bad_alloc
有人可以在这里建议可能的原因.
编辑:
这就是实际堆栈的样子
ntdll.dll!7c90e8e5()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c9100d3()
MyApp.exe!_heap_alloc_base(unsigned int size=72) Line 55 C
MyApp.exe!_heap_alloc_dbg_impl(unsigned int nSize=36, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x0af3f0e4) Line 431 + 0x9 bytes C++
MyApp.exe!_nh_malloc_dbg_impl(unsigned int nSize=36, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x0af3f0e4) Line 239 …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以初始化一个std::map带n键:value元素,其中n是预定义的(类似于数组初始化:) array[n].
我不知道这样的构造函数存在,std::map但我想我可以问以防万一.
或者可以做的是:
#include <iostream>
#include <map>
int main()
{
int n = 5;
std::map<int,double> randomMap;
for(int i = 0; i < n; ++i)
{
randomMap.insert({i,0.9});
}
for(auto j: randomMap)
{
std::cout<<"key: " << j.first <<"\tvalue: " << j.second << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)