Articles of stl

当一个线程locking一个大地图时如何避免冻结其他线程

如何避免冻结其他线程试图访问当前线程正在locking的地图? 见下面的代码: //pseudo code std::map<string, CSomeClass* > gBigMap; void AccessMapForWriting(string aString){ pthread_mutex_lock(&MapLock); CSomeClass* obj = gBigMap[aString]; if (obj){ gBigMap.erase(aString); delete obj; obj = NULL; } pthread_mutex_unlock(&MapLock); } void AccessMapForReading(string aString){ pthread_mutex_lock(&MapLock); CSomeClass* obj = gBigMap[aString]; //below code consumes much time //sometimes it even sleeps for milliseconds if (obj){ obj->TimeConsumingOperation(); } pthread_mutex_unlock(&MapLock); } //other threads will […]

在const memeber函数中使用bind1st

ClassA & operator << ( ClassA &, int32_t ) { … } class ClassMain { public: insert( ClassA & c ) const; … private: std::set<int> m_setContainer; }; struct InsertOpt : binary_function<ClassA, int, ClassA&> { ClassA & operator( )( ClassA & c, int val ) const { c << val; return c; } }; void ClassMain::insert( […]

c ++用非拉丁文名称打开文件

我有这样的文件。 我只是想正确打开非拉丁文名称的文件。 我只有非拉丁文名称的拉丁文名称的文件没有问题。 我使用QDir扫描目录,我在QString中保存名称,所以它在里面保持良好。 但打开文件存在瓶颈。 它得到这样我不想使用QFile,我只能使用C + +stream(更优选)或C文件。 当我想打开文件时,我这样做: fstream stream(source.toStdString().c_str(),ios_base::in | ios_base::binary); 之后,我检查是否尝试成功: if(!stream.is_open()) { cout<<"file wasn't opened " <<source.toStdString().c_str())<<"\n"; return false; // cout was redirected to file // just a notice } 我得到我的日志文件: 文件未打开/home/sh/.mozilla/firefox/004 _ ??????? – ????? – ?????。mp3 它不适用于任何具有非拉丁文名称的文件,并且对于每个带有拉丁文名称的文件都可以正常工作。 我明白这个问题可以跳过使用QFile。 但是我想知道,是否有可能在没有第三方库的情况下完成它,还是有其他解决方法? 提前感谢您的任何提示。

在Linux中的STL容器和线程(并发写入)

我正在寻找使用STL容器(如std :: map和std :: vector)和pthreads的最佳策略。 什么是规范的方式去? 一个简单的例子: std::map<string, vector<string>> myMap; 我们如何保证并发? mutex_lock; write at myMap; mutex_unlock; 另外,我想知道pthreads和STL在一起使用时是否面临性能问题。 系统:Liunx,g ++,pthreads,没有提升,没有英特尔TBB

std :: map lower_bound没有返回正确的值

下午好,我正在尝试使用std :: map的lower_found成员函数。 但是,它一直回答错误的答案。 这是我的testing代码的摘录。 请向我解释如何正确地制作std :: map下限函数。 谢谢。 class Interval { public: explicit Interval(int item){ mLow = item; mHigh = item; mStamp = 0; } Interval(int low, int high, int stamp = 0){ mLow = low; mHigh = high; mStamp = stamp; } Interval(void){ mLow = 0; mHigh = 0; mStamp = 0; } […]

指向vector元素的指针崩溃

vector<int> v; v.push_back(1); int * p = &v[0]; for (int i = 2; i <= 100; ++i) { v.push_back(i); } *p = 5; 我知道向量重新分配新的内存来增加容量,但是p只是指向一些内存地址的指针,而p本身没有改变。 即使在向量重新分配之后,由p指向的内存也在同一进程的地址空间中。 为什么会崩溃?

std :: sort(来自<algorithm>)崩溃

下面的程序,一个简单的向量sorting,在第二次调用时崩溃t> = 17。 第一种sorting成功,即使吨== 100.奋斗了很长一段时间,但我无法弄清楚什么是错的。 有人可以帮帮我吗? 我已经在MacBook Air以及Linux机器上尝试过了,出人意料的是,我看到了相同的结果。 #include<iostream> #include<vector> #include<algorithm> using namespace std; struct tc { unsigned int n; }; bool sort_by_n( tc a, tc b ) { return an <= bn; } vector<tc> tcv(100); vector<int> tv(100); int main() { unsigned int t; cin >> t; for ( unsigned int i = 0 ; […]

如何在Linux中显示GDB / Nemiver中的C ++ STL Containers

我使用的是Linux(Ubuntu 11.10)和gdb 7.3 / Nemiver 0.8.2。 我想显示STL容器的内容,但到目前为止,我还没有真正成功。 有没有其他的可视化debugging器(更好的基于gdb)我应该用来显示STL容器variables? 我正在寻找一个支持组成容器(即std::map<int, std::vector< std::pair< … > > > )的解决scheme。 干杯

GDB支持Python,ImportError没有名为gdb的模块

我想用python支持来编译gdb,所以我可以使用下面提供的PrettyPrinters: http : //gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python 我从( http://ftp.gnu.org/gnu/gdb/gdb-7.6.1.tar.gz )下载了最新的gdb源代码,并在我的Centos 6.4上进行编译,如下所示:1. ./configure –with -python 2. make 我需要提供一个path或另一个参数–with-python的path到Python库或可执行文件? 编译后,当我运行gdb,我看到这个警告: Python Exception <type 'exceptions.ImportError'> No module named gdb: warning: Could not load the Python gdb module from `/usr/local/share/gdb/python'. Limited Python support is available from the _gdb module. Suggest passing –data-directory=/path/to/gdb/data-directory. 这个例外是显而易见的,我接下来要做的任何事情都会失败,因为它需要gdb模块,但是我试了一下。 所以我在〜/ .gdbinit中添加了以下几行: import sys sys.path.insert(0, '/tmp/pretty/python') from libstdcxx.v6.printers import […]

自定义分配器对于std :: map失败

我试图使用自定义分配器与C + + STL容器,它与vector,但与地图失败。 关于mmap_allocator<std::_Rb_tree_node<std::pair<const int, int> > >一些奇怪的错误mmap_allocator<std::_Rb_tree_node<std::pair<const int, int> > > mmap_allocator<std::pair<const int, int> >并没有使用mmap_allocator<std::pair<const int, int> > In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/map:60, from 4.cpp:2: /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_tree.h: In member function '_Alloc std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::get_allocator() const [with _Key = int, _Val = std::pair<const int, int>, _KeyOfValue = std::_Select1st<std::pair<const int, int> >, _Compare = […]