2011-01-27 41 views
3

我有定義爲vector<char>的載體,以及我有一些功能,其被調用時,其接收範圍內的一些點 - 類似如下:是否有可能從給定的迭代器訪問基礎指針到矢量?

template <typename Iterator> 
void foo(Iterator& start, Iterator& end) 
{ 
} 

在上面的函數,我現在有到std::find呼叫尋找一個給定的角色 - 這是太慢了(我知道這是因爲我已配置文件 - :))。我想要做的事(在將來的某個時刻是使用SSE4.2內部函數來搜索字符),但是現在,我想要做的是矢量搜索,即類似於以下內容(不是安全操作)。

unsigned long long* scanv = reinterpret_cast<unsigned long long*>(<access pointer at start>); 
// some byte magic. 

所以我的問題是 - 要做到這一點也通過向量以及然後做一個distance,然後&vect[index]訪問底層指針的唯一途徑?

+0

順便提一句,你是否考慮過使用`string`來代替`vector `? `string :: find()`可能會針對這類事情進行優化。 – 2011-01-27 10:16:00

+3

在制定優化計劃之前,你怎麼敢分析一下!你應該開始他們,沒有計劃,沒有指導,然後想知道爲什麼你的程序破碎,混亂,無法修復;修正它。 :) – GManNickG 2011-01-27 10:16:32

+0

@Oli,是的,底層的`strchr`已針對SSE4.2進行了優化,但目前我無法訪問支持此功能的內核(以及相應的glibc版本),而我正在使用` std :: string` with`vector`,因爲其他操作(複製,刪除,搜索序列等)似乎速度更快... – Nim 2011-01-27 10:20:42

回答

4

如果你知道你有一個std::vector<T>::iterator,那麼做&*it是安全的。

但是,請注意,將其轉換爲unsigned long long *並不安全,因爲對齊要求會有所不同。

2

你可以使用&(*start)得到一個指向你的矢量的開始。從那裏開始,你可以使用指針算術。但那是什麼關於unsigned long long*