簡體   English   中英

在std :: binary_search()上查詢

[英]Inquiry on std::binary_search()

我目前正在使用std :: binary_search()(來自庫)來確定列表中是否存在某個實例。 在開始使用它之前,我想知道它是如何工作的。

我的理解是,它使用比較(對於用戶定義的結構/類,它需要訪問用戶定義的比較函數)來確定列表/向量中是否存在對象實例。 根據該網站( http://www.cplusplus.com/reference/algorithm/binary_search/ ),使用的范圍是:

[first, last)

那么是否不包括 last,因為它必須將lastlast + 1相比較?

用戶定義的比較函數的邏輯也沒有關系,只要它區分對象/類內的屬性即可。 那是對的嗎?

例如,如果我的結構/類包含以下內容:

coord
{
    int X;
    int Y;
}

我必須確保我的比較函數區分(以某種方式,例如大於/小於比較)列表/向量中元素a和b的X和Y屬性。

std :: binary_search()被實現為常見的二進制搜索算法,它最多執行log2(N)+1個元素比較。 (有關如何實現二進制搜索的更多信息,請檢查此鏈接

那么它是否不包括last,因為它必須將last與last + 1進行比較?

不,原因只是為了方便使用。 您可以將函數調用為:

std::binary_search (v.begin(), v.end(), 42)

請注意,v.end()將迭代器返回到序列末尾的元素。 因此,它不指向任何元素,因此不應在搜索中進行評估。

用戶定義的比較函數的邏輯也沒有關系,只要它區分對象/類內的屬性即可。 那是對的嗎?

比較函數用於binary_search(),以便知道您要查找的元素是否在當前要測試的元素之前。 換句話說,比較函數必須能夠比較兩個元素,如果第一個元素“低於”第二個元素,則返回(必須放在第二個元素之前的容器中)。

對於您的Coord示例,您可以編寫一個比較器函數,例如:

struct lessThanKey
{
    inline bool operator() (const Coord& lhs, const Coord& rhs)
    {
        return (lhs.x < rhs.x) || ((lhs.x == rhs.x) && (lhs.y < rhs.y));
    }
};

std::binary_search(v.begin(), v.end(), Coord{42, 42}, lessThanKey());

的范圍包括最后一個元素作為一般庫慣例,它意味着第一最后的迭代之間的距離等於在所述范圍內,並且還使范圍可用於使用循環被測試元件的數目:

while(first != last)
{
    // process stuff
    ++first;
}

std::binary_search必須在使用相同(可能是用戶定義的) 比較函數進行排序的排序數據上執行。

該功能需要在兩個元素之間建立小於關系。

struct coord
{
    int x;
    int y;
};

struct CoordComparator
{
    bool operator()(const coord& lhs, const coord& rhs) const
    {
        return lhs.x == rhs.x ? lhs.y < rhs.y : lhs.x < rhs.x;
    }
};

std::vector<coord> v { {1, 1}, {2, 1}, {2, 2}, {1, 2} };

std::sort(v.begin(), v.end(), CoordComparator());

if(std::binary_search(v.begin(), v.end(), coord{2, 1}, CoordComparator()))
{
    // element found in range
}

可以定義小於關系,以使較大的小於較小的值,從而給出反向排序的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM