我正在运行一个交互式程序,输出大约10 MB [编辑:实际上可能接近100 MB]的ASCII文本.emacs shell-mode(Aquamacs)中的性能慢得令人无法接受,需要数小时才能完成.我确实执行了buffer-disable-undo,这可以加快速度,但速度仍然太慢.
我尝试在隐藏缓冲区窗口的情况下运行程序,但是程序完成了,当我重新选择缓冲区时,我仍然需要等待数小时才能将输出设置为假脱机.
是否有一些命令我可以给emacs以使性能可以接受?我不明白shell模式怎么可能这么慢:这是一台带有64位现代多核CPU和SSD的32 GB多核机器.
我正在寻找一种简单的方法来为map
C++ 11中的a值创建一个迭代器.
这个方法应该简单透明:简单,因为它应该易于实现,并且透明,因为客户端不应该知道值来自地图而不是集合.
之前已经多次询问过这个问题.其中许多问题早于C++ 11并使用boost,我不想使用它.有些并不简单,John Ahlgren的解决方案,例如http://john-ahlgren.blogspot.com/2013/10/how-to-iterate-over-values-of-stdmap.html,例如需要一页代码编写自定义迭代器.
其他人不透明,即显然可以写:
map<string,foo> mymap;
for (auto it=mymap.begin();it!=mymap.end();++it){
Foo val= it->second;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我不想这样做,因为我不希望客户端必须知道数据表示.
问题出现如下.
我有一堆用长"钥匙"唯一索引的对象.有时我想操纵这些对象的集合.其他时候我想要检索一个给定键的对象.
我不能直接使用"set"类有几个原因,其中主要是它不存储可变实例,并且这些实例必须是可变的(显然,除了键之外).
所以,我决定将所有对象存储在一个巨大的全局哈希表中:
map<long,Foo> all_the_objects;
Run Code Online (Sandbox Code Playgroud)
然后我根本不工作set<Foo>
.相反,我使用set<long>
并使用适配器来模拟一组Foo,即
class SetOfFoo{
private: set<long> theKeys;
public:
void insert(const & Foo);
size_t size() return theKeys.size();
bool is_member(const & Foo)
{return theKeys.find(Foo.key)
!= theKeys.end;}
Foo & insert(const & Foo val){
long key=val.key;
all_the_objects[key]=val;
return all_the_objects[key];
}
...::iterator begin() {???}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,SetOfFoo类的客户端不知道或不需要知道SetOfFoo是作为一组键实现的.
我也不能在适配器类中自己创建一个Vector,因为无法在C++集合中存储引用.
是否真的不可能以简单,透明的方式迭代map <>值?我觉得很难相信,因为这是一个非常普遍的需求,并且在我看到的每种语言中都有微不足道的事情.我只是不明白这怎么可能很难.
我一直在使用高度简洁和直观的C++语法来查找两个已排序的vector
s并将结果放在第三个中vector
:
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
Run Code Online (Sandbox Code Playgroud)
这应该设置c
为交集(a
,b
),假设a
和b
排序.
但是,如果我只是使用c.begin()
(我以为我在某个地方看到了一个例子,这就是我做的原因):
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
Run Code Online (Sandbox Code Playgroud)
set_intersection
期望OutputIterator
at参数.我认为标准只需要c.begin()
返回a forward iterator
,我想这可能是也可能不是OutputIterator
.
无论如何,代码与c.begin()
编译下铿锵.
保证在标准下发生什么?如果这编译,可能发生的事情 - 也就是说,当返回的迭代器c.begin()
最终递增超过向量的末尾,并且尝试访问指向的元素时,必须/可能发生什么?在这种情况下,符合标准的实现是否可以无声地扩展向量,因此begin()
实际上是一个OutputIterator
类似的附加back_inserter
?
我问这个主要是为了理解标准如何与迭代器一起工作:真正发生了什么,所以我可以使用STL超越复制和粘贴.
对STD集合返回的元素(如地图)的引用有效期多长?
例如,在此代码中:
struct Employee{
int salary;
string name; // the key
};
map<string,Employee> allemployees;
...
Employee & Joe = allemployees["Joe Smith"];
Joe.salary=150; // change "Joe Smith"'s salary
assert(allemployees["Joe Smith"].salary==150); //always true
....
allemployees["Mark Jones"]= Employee();
... // No "Joe Smith" operations in the dots
Joe.salary=200;
assert (allemployees["Joe Smith"].salary==200); //true or not?
Run Code Online (Sandbox Code Playgroud)
}
换句话说,我从地图中获取了一个值引用.但后来我在底层地图上进行了各种其他插入,删除等操作.原值参考仍然是好的吗?其他系列呢?
而且,我怎么知道呢?我看着Stroustrup,但没有看到任何东西.
来自C背景我对引用和集合及其交互感到困惑.我应该考虑其值是参考的地图吗?这甚至意味着什么?
这是一个更普遍的问题:我在哪里可以找到这个问题和类似问题的规范性答案?
[这是已删除问题的修订版]
我最近向std::string
构造函数传递了一个空指针并得到了未定义的行为。我敢肯定,这是在我之前成千上万的程序员所做的事情,同样的错误无疑已经导致无数程序崩溃。使用代码转换时谈到了很多char*
使用代码std::string
,它的那种东西,是不是在编译时开捕,并可以很容易地在运行时的单元测试错过。
我感到困惑的是指定std::string
这种方式的原因。
为什么不直接定义std::string(NULL)==""
?
效率损失可以忽略不计,我怀疑它在实际程序中甚至可以测量。
有谁知道std::string(NULL)
未定义的可能原因是什么?
我似乎无法使用lldb来调用带有字符串参数的函数.在这个问题中,使用字符串参数调用函数与lldb:如何?,我给出了一个简单的测试文件来说明问题.用户回答了该问题,以显示在这种情况下修改测试文件如何解决问题.
但是对于更一般的情况,我仍然无法使用lldb中的字符串参数调用函数.
要设置它,我需要显示两个文件.第一个文件就像在另一个问题中一样,一个简单的类lldbtest定义了一个带字符串参数的构造函数.然后,另一个文件定义调试器将中断的函数.
第一个文件(没有一些#includes)看起来像这样:
struct lldbtest{
int bar=5;
lldbtest();
lldbtest(int foo);
lldbtest(string &fum);
};
lldbtest::lldbtest() { bar=6; }
lldbtest::lldbtest(int) { bar=7; }
lldbtest::lldbtest(string&) { bar=8; }
int main(){
string name="fum";
lldbtest x,y(3);
cout<<x.bar<<y.bar<<endl;
int zz=nothing();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第二个文件如下所示:
using namespace std;
int nothing(){
cout<<"hello there"<<endl;
int n=0,m=1,r=2;
return m+r+n;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在第二个文件的return语句中设置断点时,并评估:
p lldbtest(string("bar"))
Run Code Online (Sandbox Code Playgroud)
我收到一条很长的错误消息,很难在这里发布,但看起来像这样:
error: no matching conversion for functional-style cast from 'string' (aka 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >') to 'lldbtest'
note: candidate constructor (the implicit copy constructor) …
Run Code Online (Sandbox Code Playgroud) 我无法从Windows 10中的命令行提示符运行Microsoft Visual Studio C ++编译器“ cl”。我正在使用新的Windows 10安装和新的Microsoft Visual Studio 2017社区版本。
我收到错误:'cl'无法识别为内部或外部命令。
我尝试从两个不同的提示中运行它:
两者都不起作用。每次都给出上述错误。
Web上有许多关于此问题的线程,但是它们似乎都具有以下特征:所提供的信息对于我和他人的系统而言不准确或不最新。(这在Visual Studio的早期版本上可以很好地工作,但是显然Microsoft在不更新或测试文档的情况下更改了其2017版的许多位置/脚本,因此应用程序和在线中的现有文档对于不同的建议是一堆混乱的建议版本的Visual Studio)。
我的问题是:从新的Windows 10安装中,如何从命令行访问Microsoft C ++编译器?
我在操作vector<T>
中使用的某些功能出现了很多,但标准接口很笨重.
例如,假设v
是vector<T>
a 的类型typename T
.理想情况下,我想打电话:
v.probe(x) //returns true if x is in v
v.sort() // sort v
v.unique() // unique elements of x
v.locate(x) // pointer to the element in v equal to x if it exists, otherwise NULL
v.cat(w) // concatenate vector w to x
v.erase(x) // erase all x’s from v
Run Code Online (Sandbox Code Playgroud)
等等.
这些都可以在stl中完成,但界面笨重且冗长.例如,v.probe(x)
会是这样的
std::find(v.begin(),v.end(),x)!=v.end()
Run Code Online (Sandbox Code Playgroud)
并且v.sort
是
std::sort(v.begin(),v.end())
Run Code Online (Sandbox Code Playgroud)
这使得std::sort
在复杂的左值表达式的情况下使用非常笨拙,需要一个临时的.(即,我不能轻易地排序foo->bar.names[3]
.
在STL中获得v的独特价值更加诡异,需要,我相信:
std::erase(std::unique(std::sort(v.begin(),v.end()).end(),v.end())
Run Code Online (Sandbox Code Playgroud)
我假设几乎每个C++程序员都遇到过这个问题或类似的问题.
围绕这个最好的方法是什么?
我考虑过3种选择:
为代码中使用的每种类型编写特殊用途 …
我有一个对象 o,它是 SBCL 中类 X 的一个实例。
我想要一个函数 write-X-object 以这样的方式将 o 序列化到一个文件中,当该文件用 load-X-object 读回时,生成的对象等效于 o。
;; writing the object
(write-X-object o "~/tmp/o.serialized")
;; reading the object, much later,
;; after sbcl has been exited and restarted
(setq v (read-X-object "~/tmp/o.serialized"))
Run Code Online (Sandbox Code Playgroud)
o 可能大约有 1 GB 的大小(或由数百万个较小对象组成的数组),具有复杂的结构,因此我们的想法是尽可能快地读取和写入。
让m
是类型std::smatch
。假设有一个不匹配的组i
。什么是
m.position(i)
?就此而言,什么是m[i]
?
例如,考虑
std::regex re {"^(a+)|(b+)"};
string target="aa";
std::smatch m;
std::regex_search(target,m,re);
cout<<"m[2] is: "<<m[2]<<" at position: "<<m.position(2);
Run Code Online (Sandbox Code Playgroud)
我无法从参考https://en.cppreference.com/w/cpp/regex/match_results/position 中弄清楚这里保证会发生什么以及为什么。
c++ ×8
c++11 ×4
std ×3
iterator ×2
map ×2
string ×2
aquamacs ×1
command-line ×1
common-lisp ×1
containers ×1
emacs ×1
lldb ×1
null-pointer ×1
regex ×1
regex-group ×1
sbcl ×1
shell ×1
stl ×1
vector ×1