每个标准容器具有begin和end方法,返回的迭代器是容器.然而,C++ 11显然已经引入自由函数调用std::begin和std::end该调用begin和end成员函数.所以,而不是写作
auto i = v.begin();
auto e = v.end();
Run Code Online (Sandbox Code Playgroud)
你会写的
using std::begin;
using std::end;
auto i = begin(v);
auto e = end(v);
Run Code Online (Sandbox Code Playgroud)
在他的演讲中,编写现代C++,Herb Sutter说当你想要容器的开始或结束迭代器时,你应该总是使用自由函数.但是,他没有详细说明你想要的原因.查看代码,它可以为您节省一个字符.因此,就标准容器而言,自由函数似乎完全没用.Herb Sutter表示非标准容器有好处,但他再次没有详细说明.
因此,问题是除了调用相应的成员函数版本之外,自由函数版本究竟做了什么,std::begin并且std::end做了什么,为什么要使用它们呢?
引用手册页:
使用条件变量时,总会有一个布尔谓词,涉及与每个条件等待关联的共享变量,如果线程应该继续,则为真.可能会发生pthread_cond_timedwait()或pthread_cond_wait()函数的虚假唤醒.由于从pthread_cond_timedwait()或pthread_cond_wait()返回并不意味着有关此谓词的值的任何内容,因此应在返回时重新评估谓词.
因此,pthread_cond_wait即使您没有发信号也可以返回.乍一看,这看起来非常残酷.它就像一个随机返回错误值或在实际到达正确的返回语句之前随机返回的函数.这似乎是一个主要的错误.但是他们选择在手册页中记录这一点而不是修复它的事实似乎表明有一个合理的理由为什么pthread_cond_wait最终虚假地唤醒.据推测,它有一些内在的关于它是如何工作的,这使它无法帮助.问题是什么.
为什么没有pthread_cond_wait虚假回报?为什么它不能保证它只是在它被正确发出信号后醒来?谁能解释其虚假行为的原因?
好的.如果我在一个分支上(比方说working),并且我希望合并来自另一个分支的更改(比方说master),那么我git-merge master在working分支上运行命令,并且更改将合并而不会重新定义历史记录.如果我运行git-rebase master,那么更改master将被重新放置在我的working分支的顶部.但是,如果我想合并更改master但是将我的更改working重新组合在一起,该怎么办?我怎么做?可以吗?
我可以git-rebase working在我的master分支上运行以将我的更改放在master分支的顶部,但我希望能够在我的working分支中执行此操作,而我不知道如何.我能想到的最接近的是创建一个新的分支master,然后working在其上更改rebase 的变化,但之后我会有一个新的分支而不是改变working分支.
如果要将提交移动到暂存区域 - 这是不允许的,并将其中的所有更改移动到暂存区域(有效地将分支置于提交之前的状态) - 你怎么做呢?或者是你不能做的事情?
我知道怎么做的最接近的方法是将提交中更改的所有文件复制到其他地方,在提交之前将分支重置为提交,然后尝试移动到暂存区域,移动所有将文件复制回存储库,然后将它们添加到临时区域.它有效,但它不是一个很好的解决方案.我希望能够做的只是撤消提交并将其更改为暂存区域.可以吗?如果是这样,怎么样?
我正在尝试在我正在使用的程序上使用Valgrind,但是Valgrind为我正在使用的其中一个库生成了一堆错误.我希望能够告诉它压制涉及该库的所有错误.我能为抑制文件提出的最接近的规则是
{
rule name
Memcheck:Cond
...
obj:/path/to/library/thelibrary.so
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不能完全胜任这项工作.我必须为每个出现的抑制类型(Cond,Value4,Param等)创建其中一个,并且它似乎仍然会遗漏一些在堆栈跟踪中具有库的错误.
有没有办法让Valgrind有一个单一的抑制规则让它完全忽略一个特定的库?即使没有办法制定涵盖所有抑制类型的规则,是否至少有一种方法可以创建一个忽略特定库中特定抑制类型的所有错误的规则?
我正在看一个CFLAGS -
CFLAGS=-g -w -D LINUX -O3 -fpermissive
Run Code Online (Sandbox Code Playgroud)
在Makefile中.-D标志有什么作用?我在手册页上看到了
-D name
Predefine name as a macro, with definition 1.
Run Code Online (Sandbox Code Playgroud)
但我不知道如何解释.我的解释是......它使LINUX成为一个宏,并且在linux环境中只做-03和-fpermissive.是对的吗?如果没有,那又怎样?谢谢你的帮助
我是D编程语言的新手,刚开始阅读D编程语言书.
尝试一个关联数组示例代码时遇到错误
#!/usr/bin/rdmd
import std.stdio, std.string;
void main() {
uint[string] dict;
foreach (line; stdin.byLine()) {
foreach (word; splitter(strip(line))) {
if (word in dict) continue;
auto newId = dict.length;
dict[word] = newId;
writeln(newId, '\t', word);
}
}
}
Run Code Online (Sandbox Code Playgroud)
DMD显示此错误消息:
./vocab.d(11):错误:关联数组只能用不可变键赋值,而不是char []
我正在使用DMD编译2.051
我猜测关联数组的规则自TDPL书以来已经发生了变化.
我应该如何使用带有字符串键的关联数组?
谢谢.
更新:
我在本书的后半部分找到了解决方案.
在放入数组之前使用string.idup创建重复的不可变值.
所以
dict[word.idup] = newId;
Run Code Online (Sandbox Code Playgroud)
会做的.
但这有效吗?
我正在尝试将我们的构建系统转换为cmake并且使用它生成的RPM(通过cpack)遇到了一个有趣的问题:它会自动将它认为你的RPM所具有的所有依赖项添加到其所需的列表中库.
总的来说,这很好,但就我而言,这是灾难性的.不幸的是,我们构建的开发包最终安装了一个我们自己开发的工具,它使用rpm将它们安装在一个独立的RPM数据库中.这是愚蠢的,但我无法改变它.这意味着任何普通库将依赖的所有系统库(如libc或libpthread)都不在我们的开发包中使用的RPM数据库中.因此,如果我们的某个开发包的RPM列出了所需的系统库,那么我们就无法安装它,因为rpm会认为它们没有安装(因为它们列在普通数据库而不是正常数据库中)它被告知在安装我们的包时使用).我们当前构建的东西处理得很好,因为它没有列出任何系统库作为RPM中的依赖项,但是cpack会自动填充RPM的所需库列表并将系统库放在那里.我需要一种方法来阻止它这样做.
我尝试设置CPACK_RPM_PACKAGE_REQUIRES到"",但没有效果.RPM cpack生成仍然最终会列出所需的系统库.在这一点上,我所能想到的就是复制RPM cpack生成器并将其破解以实现我想要的并使用它而不是标准的生成器,但我宁愿避免这种情况.有没有人知道如何让cpack停止使用所需的库填充RPM?
我非常喜欢D实现的消息传递原语.我只看到消息传递的例子中的程序,但.是否支持通过网络分发消息?
理想情况下,我希望能够做的是获取时区的名称,并询问Windows的相应时区信息(偏离UTC,DST偏移,DST开关的日期等).看起来Windows使用TIME_ZONE_INFORMATION结构来保存这种信息.因此,据推测,我想要一个函数,它接受带有时区名称的字符串并返回一个TIME_ZONE_INFORMATION结构.
但是,我能找到的所有函数都是GetTimeZoneInformation(),这些函数为我提供了本地时间的TIME_ZONE_INFORMATION.我需要的是一个函数,它将为我提供任意时区的信息,而不管本地时区是什么.
我看到获取该信息的唯一方法是直接从注册表中获取它,这不太理想.该TIME_ZONE_INFORMATION页面显示了它在注册表中,所以它应该可以从那里获取的信息,但我更喜欢一个正确的系统功能做这件事.这样的功能是否存在,或者我是否必须进行注册表潜水才能获得任意时区的时区信息?