在C++中,每当函数创建许多(数百或数千)个值时,我曾经让调用者传递一个数组,然后我的函数用输出值填充:
void computeValues(int input, std::vector<int>& output);
Run Code Online (Sandbox Code Playgroud)
因此,该函数将output使用它计算的值填充向量.但这并不是真正优秀的C++风格,正如我现在意识到的那样.
以下函数签名更好,因为它不承诺使用a std::vector,但可以使用任何容器:
void computeValues(int input, std::insert_iterator<int> outputInserter);
Run Code Online (Sandbox Code Playgroud)
现在,来电者可以与一些人打电话inserter:
std::vector<int> values; // or could use deque, list, map, ...
computeValues(input, std::back_inserter(values));
Run Code Online (Sandbox Code Playgroud)
同样,我们不承诺std::vector专门使用,这很好,因为用户可能只需要std::set等等的值(我应该传递iteratorby值还是引用?)
我的问题是:这是insert_iterator正确的还是标准的方式吗?还是有更好的东西?
编辑:我编辑了这个问题,以明确我不是在谈论返回两个或三个值,而是数百或数千.(想象一下,您已经返回在某个目录中找到的所有文件,或图表中的所有边缘等)
在我早期的编码时代,我倾向于将以类似方式运作的类分组.例如:
过了一会儿,它开始让我感到沮丧的是,当我在应用程序的某个特定部分工作时,我必须四处跳转才能把它拼凑起来.
在过去的几年里,我倾向于按功能组织事物.通常共享的类,例如数据库对象,我仍然保持在一起.我认为这对于像网站这样的东西更有意义:
这是最好的方法吗?有没有人有一个很好的经验法则可以遵循?
在Firefox中,您只需调用:
myInputTextField.selectionStart或myInputTextField.selectionEnd
获取输入框中所选文本的第一个和最后一个索引.
在IE中,我知道你可以调用document.selection.createRange()来调整选择.然而,对于我的生活,我没有找到任何代表选择中的字符偏移的值.
我错过了什么吗?有没有办法在IE中获得相同的价值?
谢谢!
亚历克斯
我的Web应用程序类似于StackOverflow,因为不同的用户经常编辑相同的文本块.
目前我们只支持纯文本,因此很容易向用户显示文本在编辑之间的变化情况.
我想在这些字段中支持富文本,但我的用户是非技术性的,因此任何类型的标记都不是一种选择.
有没有支持差异的基于javascript的富文本编辑器?理想情况下,差异也是富文本格式,但如果需要,它们可以用降价或类似方式呈现(我想不惜一切代价避免使用原始HTML).
实现最近使用的对象缓存的最佳方法是什么?
以下是要求和限制......
我意识到这几乎与Windows相当于Mac OS X"open"命令和Linux相当于Mac OS X"open"命令,但我具体询问一下我可以在Cygwin shell中运行的命令来使用绑定到参数扩展的当前Windows UI应用程序,如OS X在OS X上打开该应用程序,并在该应用程序中打开指定的文件.
cmd.exe启动命令不是Cygwin shell中的选项,也不是通过Cygwin可用的xdg-open或gnome-open.
有同等的吗?
如何检查有向图是否是非循环的?算法如何调用?我很感激参考.
我tar在目录中有一堆文件,我想立即从中提取所有文件.但这似乎没有做任何事情:
$ tar xf *.tar
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?如何一次解压缩一堆文件?
我一直在思考这个问题:
您是否可以利用您拥有多个CPU的优势,在多核计算机上构建更快的基础数据结构(即链表,哈希表,集合,跳转列表,布隆过滤器,红黑树等)?
我做了一些pthreads的初步试验,发现pthread_create()的顺序为30us,但是一个简单的hash_map插入所花费的时间远远少于单个核心.因此,我很难想象创建一个更快的hash_map <>,因为同步原语和线程创建是如此之慢.我还可以想象树的遍历和并行平衡,但同样,同步原语似乎会使运行时更长,而不是更短.
对我来说,我仍然觉得"我有更多的CPU,因此,我应该能够更快地做到这一点",但我无法完全围绕证据或反证据证明这一点.我在C++中进行了相当多的实验,但我现在怀疑其他语言可能会为这项任务提供更好的解决方案(erlang?).思考?
编辑细节:我认为有几种经常使用的编程/数据结构范例可能会加速.例如,我发现自己经常编写基本上看起来像这样的代码(其中实际数据已被"rand()"替换)
static const int N = 1000000;
static const int M = 10000000; // 10x more lookups
hash_map<int, int> m;
// batch insert a bunch of interesting data
for (int i = 0; i < N; i++) m[rand()] = rand();
// Do some random access lookups.
for (int i = 0; i < M; i++) m[rand()]++;
Run Code Online (Sandbox Code Playgroud)
这种范例经常用于名称 - 值设置和配置数据,批处理等等.10x(或更多)查找/插入比率使传统的hash_map <>成为这种操作的理想选择.
这可以很容易地分成两半,具有插入阶段和查找阶段,并且在并行世界中,在两半之间可能存在一些"刷新队列"操作.交错插入+查找版本更难:
hash_map<int, int> m;
for (int i = 0; i < N; i++) {
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个程序,通过我们的缺陷跟踪系统的Web界面一次克隆多个错误.在继续之前,如何在页面完全加载之前等待?
//This is pseudo code, but this should give you an idea of what I'm trying to do. The
//actual code uses multi-threading and all that good stuff :).
foreach (string bug in bugs)
{
webBrowser.Navigate(new Uri(url));
webBrowser.Document.GetElementById("product").SetAttribute("value", product);
webBrowser.Document.GetElementById("version").SetAttribute("value", version);
webBrowser.Document.GetElementById("commit").InvokeMember("click");
//Need code to wait for page to load before continuing.
}
Run Code Online (Sandbox Code Playgroud)