如何确定编译器实现的C++标准版本?据我所知,以下是我所知道的标准:
我理解递归互斥锁允许互斥锁被锁定不止一次而不会陷入死锁,应该解锁相同的次数.但是在什么特定情况下你需要使用递归互斥体?我在寻找设计/代码级别的情况.
我正在维护一个包含10个条目的固定长度表.每个项目都是4个字段的结构.将有数字位置指定的插入,更新和删除操作.我想知道哪个是用于维护此信息表的最佳数据结构:
array - insert/delete由于移位而占用线性时间; 更新需要恒定的时间; 没有空间用于指针; 使用[]访问项目的速度更快.
stl vector - 插入/删除由于移位而占用线性时间; 更新需要恒定的时间; 没有空间用于指针; 访问项目比数组慢,因为它是对operator []和链接列表的调用.
stl list - 插入和删除需要线性时间,因为在应用插入/删除之前需要迭代到特定位置; 指针需要额外的空间; 访问项目比数组慢,因为它是链接列表线性遍历.
现在,我的选择是使用数组.这是否合理?还是我错过了什么?
哪个更快:遍历列表,然后插入节点或在数组中移动项目以产生空位置然后将项目插入该位置?
衡量这种表现的最佳方法是什么?我可以只显示操作前后的时间戳吗?
在我读过的关于多线程的资源中,与信号量相比,更经常使用和讨论互斥.我的问题是你什么时候使用信号量而不是互斥量?我没有在Boost线程中看到信号量.这是否意味着信号量这些天不再使用太多?
据我所知,信号量允许多个线程共享资源.只有当这些线程只读取资源但不写入时,才可能这样做.它是否正确?
我已经读过按位置索引访问元素可以在STL双端队列中以恒定时间完成.据我所知,双端队列中的元素可能存储在几个非连续的位置,从而消除了通过指针算法的安全访问.例如:
ABC-> defghi-> jkl-> MNOP
上面的双端队列元素由一个字符组成.一组中的字符集表示它被分配在连续的存储器中(例如,abc在单个存储器块中,defhi位于另一个存储器块中,等等).任何人都可以解释如何通过位置索引进行访问可以在恒定时间内完成,特别是如果要访问的元素在第二个块中?或者双端队列是否有指向这组块的指针?
更新:或者deque还有其他常见的实现吗?
我正在尝试了解条件变量以及如何在生产者 - 消费者情况下使用它.我有一个队列,其中一个线程将数字推入队列,而另一个线程从队列中弹出数字.我希望在生产线程放置一些数据时使用条件变量来指示消费线程.问题是有时(或大多数时候)它只将两个项目推入队列然后挂起.我在produce()函数中指出它在调试模式下运行时停止.任何人都可以帮我指出为什么会这样吗?
我有以下全局变量:
boost::mutex mutexQ; // mutex protecting the queue
boost::mutex mutexCond; // mutex for the condition variable
boost::condition_variable condQ;
Run Code Online (Sandbox Code Playgroud)
以下是我的消费者主题:
void consume()
{
while( !bStop ) // globally declared, stops when ESC key is pressed
{
boost::unique_lock lock( mutexCond );
while( !bDataReady )
{
condQ.wait( lock );
}
// Process data
if( !messageQ.empty() )
{
boost::mutex::scoped_lock lock( mutexQ );
string s = messageQ.front();
messageQ.pop();
}
}
}
Run Code Online (Sandbox Code Playgroud)
下面是我的制作人主题:
void produce()
{
int i = 0;
while(( !bStop ) …Run Code Online (Sandbox Code Playgroud) 首先,示例代码:
情况1:
typedef char* CHARS;
typedef CHARS const CPTR; // constant pointer to chars
Run Code Online (Sandbox Code Playgroud)
文本替换CHARS变为:
typedef char* const CPTR; // still a constant pointer to chars
Run Code Online (Sandbox Code Playgroud)
案例2:
typedef char* CHARS;
typedef const CHARS CPTR; // constant pointer to chars
Run Code Online (Sandbox Code Playgroud)
文本替换CHARS变为:
typedef const char* CPTR; // pointer to constant chars
Run Code Online (Sandbox Code Playgroud)
在案例2中,在文本替换CHARS之后,typedef的含义发生了变化.为什么会这样?C++如何解释这个定义?
据我所知,当重载operator =时,返回值应该是非const引用.
A& A::operator=( const A& )
{
// check for self-assignment, do assignment
return *this;
}
Run Code Online (Sandbox Code Playgroud)
在以下情况下允许调用非const成员函数是非const的:
( a = b ).f();
Run Code Online (Sandbox Code Playgroud)
但为什么要返回参考?如果返回值未被声明为引用,它会在什么情况下产生问题,让我们说按值返回?
假设正确实现了复制构造函数.
我正在尝试了解条件变量.我想知道使用条件变量的常见情况.
一个示例是在阻塞队列中,其中两个线程访问队列 - 生产者线程将项目推入队列,而使用者线程从队列中弹出一个项目.如果队列为空,则消费者线程正在等待,直到生产者线程发送信号.
您需要使用条件变量的其他设计情况是什么?
我更喜欢基于经验的例子,例如真实应用程序中的例子.
我对以下代码中发生的事情感到有点困惑:
const int e = 2;
int* w = ( int* ) &e; // (1) cast to remove const-ness
*w = 5; // (2)
cout << *w << endl; // (3) outputs 5
cout << e << endl; // (4) outputs 2
cout << "w = " << w << endl; // (5) w points to the address of e
cout << "&e = " << &e << endl;
Run Code Online (Sandbox Code Playgroud)
在(1)中,w指向e的地址.在(2)中,该值变为5.但是,当显示*w和e的值时,它们的值不同.但是如果你打印w指针和&e的值,它们具有相同的值/地址.
为什么e仍然包含2,即使它被改为5?他们存放在一个单独的位置?还是暂时的?但是,为什么w指出的价值仍然是e的地址?