小编Set*_*gie的帖子

通过偏移索引Perl数组的速度

根据这个问题这个答案,列表实现为数组:

Perl使用数组和第一个/最后一个元素偏移实现列表.数组的分配大于所需的偏移量,最初指向数组中间的偏移量,因此在重新分配底层数组之前,在两个方向(未移位和推送/插入)都有增长的空间.这种实现的结果是所有perl的原始列表操作符(插入,获取,确定数组大小,推送,弹出,移位,非移位等)在O(1)时间内执行.

因此,您希望通过数字偏移量访问元素的速度同样快,因为它们是实现中的数组,可提供非常快速的常量时间索引.然而,作者在学习Perl的脚注中说

索引到数组不是使用Perl的优势.如果使用避免使用索引的pop,push和类似运算符,则代码通常比使用多个索引时更快,并且避免"逐个"错误,通常称为"fencepost"错误.有时,一个刚开始的Perl程序员(想要了解Perl的速度与C的比较)将采用针对C优化的排序算法(具有许多数组索引操作),在Perl中直接重写它(再次,使用许多索引操作)和想知道为什么它这么慢.答案是使用Stradivarius小提琴敲钉子不应该被认为是一种合理的构造技术.

当一个列表真的是一个阵列时,怎么会这样呢?我知道尝试将Perl的速度与C进行比较是完全无知的,但是不会通过偏移索引列表与pop或push或其他什么一样快?这些似乎相互矛盾.

arrays indexing perl performance implementation

11
推荐指数
1
解决办法
938
查看次数

滚动到虚拟化ItemsControl的元素

我有一个ItemsControl在a中显示其项目ScrollViewer,并进行虚拟化.我试图将其滚动ScrollViewer到它包含的(屏幕外,因此虚拟化)项目.但是,由于项目是虚拟化的,因此屏幕上并不存在并且没有位置(IIUC).

我已尝试BringIntoView过子元素,但它不会滚动到视图中.我也尝试手动用做它TransformToAncestor,TransformBoundsScrollToVerticalOffset,但TransformToAncestor不会返回(我猜是因为虚拟化的同时,因为它没有位置,但我没有这方面的证明)和代码它从未执行后.

是否可以滚动到虚拟化的项目ItemsControl?如果是这样,怎么样?

c# wpf itemscontrol virtualizingstackpanel

10
推荐指数
3
解决办法
7795
查看次数

运算符是否可以为initializer_list文字重载?

我试图重载运算符std::initializer_list,但以下编译既不在GCC 4.7.2也不编译为Clang 3.2:

#include <initializer_list>

void operator+(const std::initializer_list<int>&, const std::initializer_list<int>&);

int main() {
   {1, 2} + {3, 4};
}
Run Code Online (Sandbox Code Playgroud)

13.5/6表示运算符函数应至少有一个参数,其类型是类,枚举或引用,并且标准指定initializer_list为模板类,所以对我来说它似乎应该符合.然而,显然Clang和GCC都认为我正在尝试使用他们的非标准块表达式.

GCC:

Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:7:8: warning: left operand of comma operator has no effect [-Wunused-value]
source.cpp:7:9: error: expected ';' before '}' token
source.cpp:7:9: warning: right operand of comma operator has no effect [-Wunused-value]
source.cpp:7:13: error: expected primary-expression before '{' token
source.cpp:7:13: error: expected ';' before '{' token
Run Code Online (Sandbox Code Playgroud)

铛:

Compilation finished …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading initializer-list

10
推荐指数
1
解决办法
788
查看次数

确定正在编译C++程序的环境的换行符

如何在C++中确定环境换行符1?谷歌为C#和.NET提供了许多结果,但我没有看到任何方法为非CLI C++做到这一点.

附加信息:我需要扫描一个const char*字符.

1 "环境换行"我的意思是\r\n在Windows,\nLinux和\rMac上.

c++ newline

9
推荐指数
1
解决办法
6964
查看次数

为什么不是File.new符号的参数而不是字符串?

我想知道为什么编写File库的人决定制作参数来确定文件以字符串而不是符号打开的模式.

例如,现在就是这样:

f = File.new('file', 'rw')
Run Code Online (Sandbox Code Playgroud)

但这不是一个更好的设计

f = File.new('file', :rw)
Run Code Online (Sandbox Code Playgroud)

甚至

f = File.new(:file, :rw)
Run Code Online (Sandbox Code Playgroud)

例如?这似乎是使用它们的最佳位置,因为参数肯定不需要是可变的.

我有兴趣知道它为什么会这样出现.


更新:我刚读完一个关于符号与字符串的相关问题,我认为共识是符号不像字符串那样众所周知,并且每个人都习惯使用字符串来索引哈希表.但是,我不认为Ruby标准库的设计者对符号主题的无知是有效的,所以我不认为这就是原因.

ruby symbols language-design

9
推荐指数
1
解决办法
163
查看次数

使用typedef'dint导致错误,而"unsigned int"不会...?

出于某种原因,当我在我的程序中将变量定义为"uint"而不是"unsigned int"时,它会出错.这看起来很奇怪,因为uint的typedef为:

typedef unsigned int uint;
Run Code Online (Sandbox Code Playgroud)

......所以我认为我可以互换地使用这两个.更确切地说,我正在分配一个函数的结果,该函数将"unsigned int"返回到uint变量中,然后在向量调整大小调用中使用该uint ...此时它出错.即,我的代码看起来像这样:

unsigned int getUInt()
{
    return 3;
}

int main(void) {
    vector<vector<float> > vectVect(100000);
    for(uint i = 0; i < vectVect.size(); ++i)
    {
        vector<float>& myVect = vectVect[i];
        uint myUnsignedInt = getUInt();
        myVect.resize(myUnsignedInt);
    }
    cout << "finished" << endl;
}
Run Code Online (Sandbox Code Playgroud)

...它出错的行是myVect.resize行.

显然,我已经有了一个解决方案,但我想了解为什么会发生这种情况,因为我非常困惑.有人有主意吗?

PS - 如果有人认为它可能很重要,我在fedora 15上使用gcc v4.1.2 ...而定义uint的include文件是/usr/include/sys/types.h.

c++ unsigned gcc typedef uint

9
推荐指数
1
解决办法
2万
查看次数

跨C API边界传递异常

我正在用C++编写一个使用旧版C API的库.我的库的客户端可以指定回调函数,它通过我的库间接调用,通过C API调用.这意味着必须处理客户端回调中的所有异常.

我的问题是:如何在边界的一侧捕获异常,并在C API边界重新生成后重新抛出它,并且执行返回到C++域,以便客户端代码可以处理异常?

c++ exception-handling exception c-api

9
推荐指数
1
解决办法
1541
查看次数

结束标记内的XML/HTML标记名称是否真的必要?

本身并不是一个编程问题,但我想知道为什么在XML的结束标记中需要标记的名称.例如,不能

<a>
    <b>stuff</b>
</a>
Run Code Online (Sandbox Code Playgroud)

写的

<a>
    <b>stuff</>
</>
Run Code Online (Sandbox Code Playgroud)

那么每个结束标签</>只是终止了最后打开的标签?

所以我的问题是

  1. 这是否有效(即是否有任何我不会想到的角落情况,这将是模糊/失败)?
  2. 如果它可以工作,为什么不'他们'那样设计呢?

xml tags language-design

8
推荐指数
1
解决办法
469
查看次数

覆盖虚函数返回类型不同且不协变

啊,SO及时回来了.

我收到一个奇怪的错误:

 'B::blah': overriding virtual function return type differs and is not covariant from 'A::blah'
Run Code Online (Sandbox Code Playgroud)

以下是导致问题的代码:

class A {
public:
    class Inner { };

    virtual Inner blah() = 0;
};

class B : public A {
public:
    class Inner2 : public Inner { };

    Inner2 blah() {
        return Inner2();
    }
};
Run Code Online (Sandbox Code Playgroud)

我查了一下错误,根据我在微软网站上找到的一个页面,类型可以协变的方式之一是:

返回类型B :: f中的类与D :: f的返回类型中的类相同,或者是D :: f的返回类型中类的明确的直接或间接基类,在D中可以访问

是不是InnerInner2?如果重要的话我正在使用Microsoft Visual C++ 2010.


好的,感谢John,我了解到只有指针和引用才能协变.这是为什么?可以将Derived转换为Base,那么为什么具有从同一事物派生的返回类型的虚函数不会将返回类型转换为基类的类型?在我的例子中,似乎(A*(new B))->blah()返回一个Inner实际上Inner2已被抛出的东西是有道理的.

c++ virtual-functions return-type covariance object-slicing

8
推荐指数
1
解决办法
9926
查看次数

如何获取应用程序的Windows任务栏按钮以显示进度条的进度

Windows 7(或称Vista?)中引入的功能之一是应用程序的任务栏按钮能够显示该应用程序中进度条的进度.当我创建一个表单并在其上放置一个进度条时,它不会显示在任务栏按钮中,所以我认为这不是自动完成的.如何让Windows 7在应用程序的任务栏按钮上显示进度条的进度?

windows delphi taskbar delphi-xe progress-bar

8
推荐指数
1
解决办法
4078
查看次数