簡體   English   中英

嚴格的弱排序和std :: set / std :: map

[英]Strict Weak Ordering and std::set / std::map

#include <iostream>
#include <set>
#include <tuple>

struct Key {
  int field1;
  int field2;

  Key(int field1, int field2) : field1(field1), field2(field2) {}

  bool operator<(const Key& other) const {
    // Is this acceptable?! Seems to work
    if (field2 == 0 || other.field2 == 0) {
      return field1 < other.field1;
    } else {
      return std::tie(field1, field2) < std::tie(other.field1, other.field2);
    }
  }
};

int main() {
    std::set<Key> values{Key(4,3), Key(5,9), Key(5,7), Key(5,8), Key(6,1)};
    std::cout << values.find(Key(5,0))->field2 << std::endl; // Prints '7'
    auto range = values.equal_range(Key(5,0));
    for (auto i = range.first; i != range.second; i++) {
        std::cout << i->field2; // Prints '789'
    }
    return 0;
}

Field2在我的數據中並不總是可用,因此有時我使用通配符值0,該值可以匹配與field1匹配的任何值。 如果我從不插入具有通配符值的元素,而僅在集合中查找它們,這在C ++中是否有效? 我可以使用find函數返回這種情況下的任何值,這種情況在我的代碼中很少發生,盡管希望重復調用時它將是相同的值。

根據規范 ,binary_search似乎不需要嚴格的弱排序,這應該是執行查找時數據結構上使用的唯一算法,對嗎? 還是有一些我應該擔心的不確定行為?

25.4排序及相關操作

...為了使25.4.3中描述的算法無法正常工作,comp必須在值上引入嚴格的弱排序...

25.4.3二進制搜索

你誤會了 std::set::find在二進制搜索樹中進行查找(在典型的實現中)。 這看起來像二進制搜索算法,但是25.4.3中的算法通常不用於查找。 樹僅支持非隨機訪問迭代器,而使用線性迭代器的二進制搜索要比使用數據在BST中的知識進行查找要慢得多。

std::set的比較器必須符合Compare概念,這確實需要嚴格的弱排序

如果我從不插入具有通配符值的元素,而僅在集合中查找它們,這在C ++中是否有效?

從技術上講,因為您違反了要求。 從包含{x, a}{x, b}的集合中查找{x, 0}時,至少會得到不確定的結果。 都可以找到。 如果沒關系,那么我懷疑典型的實現會帶來麻煩。 你在做什么,不能保證受盡管標准,這是足以讓大多數人來回避它的工作。

暫無
暫無

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

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