我只是意识到标准并不能保证在std::transform. 并且它不允许回调函数或函子有副作用。但同时std::for_each实际上保证了顺序。
一种猜测是转换可以使用不保证顺序的高性能算法,但是 O(N) 已经是最好的算法。
那么为什么标准没有使从应用回调函数顺序的角度来看transform具有行为for_each?用户将从该保证中受益。
我正在开发一个项目Ubuntu Linux,当我使用GDB和中断调试应用程序时CTRL + Z,我得到了SIGTSTP和GDB预期的中断.
但是当我cont在那之后使用时,我仍然有SIGTSTP,我重复cont了很多时间,但接缝它的行为是一样的,只是反复给我SIGTSTP.
以下两个调用堆栈或者重复:
The call stack is as following alterativly:
Program received signal SIGTSTP, Stopped (user).
[Switching to Thread 0x7fffef73d700 (LWP 32591)]
0x00007ffff636dffd in read () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0 0x00007ffff636dffd in read () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6301ff8 in _IO_file_underflow () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff630303e in _IO_default_uflow () from /lib/x86_64-linux-gnu/libc.so.6
#3 0x00007ffff62f718a in _IO_getline_info () from /lib/x86_64-linux-gnu/libc.so.6
#4 …Run Code Online (Sandbox Code Playgroud) 据我了解,它pthread_cond_t是一个信号对象,类似于windows 平台上的事件。
所以基本功能pthread_cond_t应该是等待它并发出信号。界面应该如下:
int pthread_cond_wait(pthread_cond_t* cone);
int pthread_cond_singal(pthread_cond_t* cond);
Run Code Online (Sandbox Code Playgroud)
但实际上,pthread_cond_wait需要一个mutex*与其功能不直接相关的类型参数。所以你需要一个互斥锁,即使只是想为线程之间的通信创建一个信号,它不会同时访问相同的数据。
那么为什么界面设计成这样,最终给用户增加开销呢?
Edit1:
我知道互斥是用来保护条件数据的,但是如果设计没有互斥的接口,你也可以通过结合互斥和pthread_cond来实现你的目标。而且您也可以仅pthread_cond用于通知没有在它们之间共享数据的另一个线程。
例如,您可以有一个生产者线程创建文件,完成后通知另一个消费者处理文件,没有数据需要互斥锁保护。
我只是讨论这个问题,并从C++标准中了解到如下定义(强调我的)
当非静态数据成员或非静态成员函数是其命名类的受保护成员时,将应用超出第11章中所述之外的其他访问检查(11.2)115如前所述,授予对受保护成员的访问权限,因为引用发生在朋友或某个类C的成员中.如果访问要形成指向成员的指针(5.3.1),则嵌套名称说明符应表示C或从C派生的类.所有其他访问涉及(可能是隐式的)对象表达式(5.2.5).在这种情况下,对象表达式的类应为C或从C派生的类.
代码段:
class Base
{
protected:
int i;
};
class Derived : public Base
{
public:
// I cannot define it as void memfunc(Derived* obj) because of signature requirement.
void memfunc(Base* obj)
{
obj->i = 0; // ERROR, cannot access private member via Base*
Derived* dobj = (Derived*)(obj);
dobj->i = 0; // OK
}
};
Run Code Online (Sandbox Code Playgroud)
那么检查的原因是什么?为什么C++标准要通过基类指针来限制访问受保护的成员?
不重复:访问派生类中的受保护成员,我想问一下在标准中禁止它的原因.
我运行cl/P test.cpp,文件和结果如下.
TEST.CPP
#define FiltedLog( ...) \
if (logDetail) \
MP_LOG(LOG_INFO, __VA_ARGS__);
#define MP_LOG(level,fmt,...) \
BOOAT::LOG("MP", level, fmt, ##__VA_ARGS__)
#define LOG(tag,level,fmt,...) \
Log::log(tag, level, "%s: " fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__)
int main ()
{
FiltedLog ( "abc", 1, 2);
}
Run Code Online (Sandbox Code Playgroud)
Cl/P test.cpp:
#line 1 "test.cpp"
int main ()
{
if (logDetail) BOOAT::Log::log("MP", LOG_INFO, "%s: " "abc", 1, 2, __PRETTY_FUNCTION__ );;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么__PRETTY_FUNCTION__把它作为结果中的最后一个参数.我假设结果应该是:
if (logDetail) BOOAT::Log::log("MP", LOG_INFO, "%s: " "abc", __PRETTY_FUNCTION__, 1, 2);;
Run Code Online (Sandbox Code Playgroud)
这是VS 2010的错误吗?
c++ variadic-functions visual-studio-2010 c-preprocessor variadic-macros
我只觉得那static_assert被定义为一个static_assert-declaration.
根据我的理解,声明应该引入名称,函数名称/对象名称或类型名称.static_assert不适合这个.这不直观.
那么为什么static_assert定义为声明而不是postfix-expression声明呢?
遵循标准的相关部分:
static_assert-declaration:
static_assert ( constant-expression , string-literal ) ;
Run Code Online (Sandbox Code Playgroud) 我在〜/ tools/bin系统中安装了一个新的vim 7.3/usr/bin/vim中还有另一个vim 7.2.
我在$ PATH中添加了〜/ tools/bin,当我在终端中键入vim时,它正确启动了vim 7.3.但是当我使用哪个vim找到vim的路径时,它给/ usr/bin/vim应该是vim 7.2,我希望它应该是/ home/zijwu/tools/bin/vim(〜/ tools/bin)/VIM)
以下是终端的命令和输出,那么为什么给出错误的路径呢?
>vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Jul 11 2013 12:17:16)
>/usr/bin/vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Nov 15 2012 00:32:35)
>~/tools/bin/vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Jul 11 2013 12:17:16)
>echo $PATH
~/tools/bin:~/mercurial-2.6.3:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
>which vim
/usr/bin/vim
Run Code Online (Sandbox Code Playgroud) 据我所知,C++只有基于参数或implicate对象参数的函数重载.但我发现有两个operator []用于向量.它将在以下代码中选择正确的函数:
std::vector<int> v;
v[0] = 1; // This will select the non-const version.
return &v[0]; // This will select the const version.
Run Code Online (Sandbox Code Playgroud)
谁能解释这是怎么发生的?
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
Run Code Online (Sandbox Code Playgroud)
------编辑1 ------
我认为它会选择const版本,因为下面的cc文件无法使用clang ++和g ++编译并出现以下错误.不明白以下错误.谁能解释更多?
错误:无法初始化'char*'类型的返回对象,其值为'const value_type*'(又名'const char*'),返回data_.size()== 0?NULL:(&data_ [0]);
#include <assert.h>
#include <deque>
#include <vector>
#include <map>
class X
{
public:
X() {
}
virtual ~X() {
}
char* data() const {
return data_.size() == 0 ? NULL : (&data_[0]);
}
size_t size() const {
return …Run Code Online (Sandbox Code Playgroud)