2017-03-08 22 views
-1

是否可以计算数组中引用标量的索引?计算数组元素引用的索引

在C中,您可以使用指针算术来检索索引。

SomeType array[500]; 
const SomeType* e = &array[42]; 

// [...] 

size_t index = e-array; 

在Perl中有一些类似的方法吗?

my @array = (1,2,3,4,5,6,7,8,9,0); 
my $e = \$array[4]; 

# [...] 

my $index = '???'; 

原因是:

予具有相对大的(> 6Mio条目)阵列与相同结构几何相关的数据。

我也有某种基于优先级的队列,它包含对这个数组的引用。在处理这个队列时,新的元素被添加并且必须使用队列。由于这个队列也会变得相当大。和元素的优先级改变,并从数组元素及其邻居派生,我想避免队列中的复杂条目(内存大小和分配性能),并只有他们的参考他们直接访问数组中的信息。

但似乎在任务列表中使用索引将是最好的选择。

+6

这听起来像一个XY问题。你能否更详细地解释你到底想要做什么?通常将C“直接翻译”为Perl是一个糟糕的主意。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlack不是直接翻译,但我认为这将有助于描述我想要的。解决我的问题的一个可能性是保持(索引,值) - 对象,但我认为使用引用会更好,因为列表,这将保持这个对象将经常修改(插入,排序,删除)和将增长得相当大,以及源'阵列' –

+4

这里的问题是*为什么*你需要这样做。将数组中的某些内容分配给单独的标量后,为什么需要知道索引?如果你试图做这样的事情,你可能需要一个散列。同样,你需要澄清需要做你想做什么的目的。 – stevieb

回答

0

List::MoreUtils提供的例程,例如:

  • first_index
  • last_index
  • bsearch_index
  • indexes

等根据情况的不同,使用这些中的一个可能是更有效不仅仅是使用普通老式grep

my @i = grep $array[$_] == $v, 0 .. $#array; 
+0

搜索整个阵列是没有选择的。因为性能很重要,阵列相当大。我正在寻找一种方法*计算*指数。类似于C. –

+2

Perl不是C ...引用不是指针。另外,如果你不知道它,你将如何获得指向C中某个特定元素的指针? –

-1

$ e包含一个引用,您可以比较引用的相等性。

my @array = (0,0,0,0,0,0,0,0,0,0,0); 
my $e = \$array[4]; 
#.. 
my $index =$#array; 
$index-- while ($e ne \$array[$index] && $index >=0); 

print $index; 

打印出4