2017-03-08 54 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