我這里有兩個 "地圖",xs和ys,我用它們來存盤網格中的 "點"。
我還有一個陣列std::pair<int,int> arr,這樣xs[x]回傳arr中所有具有x坐標x的索引,而ys[y]回傳所有具有y坐標y的索引。
讓我們來看看以下內容:
std::unordered_map<int, std::unordered_set<size_t> > xs {
{3, {2, 0}},
{<11, {1}}。
};
std::unordered_map<int, std::unordered_set<size_t> > ys {
{2, {2 ,1},
{10, {0}}。
};
std::unordered_set<size_t> intersection;
std::set_intersection(xs[3)。 begin(),xs[3].end()。
ys[2].begin(), ys[2].end()。
std::inserter(intersection, intersection.begin())。
std::cout << intersection.size() << std::endl; //應該回傳1。
intersection.clear()。
std::set_intersection(xs[11]。 begin(),xs[11].end()。
ys[2].begin(), ys[2].end()。
std::inserter(intersection, intersection.begin())。
std::cout << intersection.size() << std::endl; //應該回傳1。
它們確實回傳1和1。沒有什么驚喜。
現在讓我們在一個函式中隔離出相交計數器:
size_t count_intersection(const std: :pair<int,int>& pt,
const std::unordered_map<int, std::unordered_set<size_t>& xs。
const std::unordered_map<int, std::unordered_set<size_t>& ys){
const int x = pt.first, y = pt.second;
//省略了一些錯誤檢查。
std::unordered_set<size_t> intersection;
std::set_intersection(xs.at(x). begin(), xs.at(x).end() 。
ys.at(y).begin(), ys.at(y).end() 。
std::inserter(intersection, intersection.begin())。
return intersection.size()。
std:: cout << count_intersection({3, 2}, xs, ys) < < std::endl;
std::cout << count_intersection({11, 2}, xs, ys) < < std::endl;
到目前為止,還不錯。
現在,讓我們在一個類中隔離所有這些東西:
class Counter {
std::vector<std::pair<int,int>> _pts;
std::unordered_map<int, std::unordered_set<size_t> > _xs;
std::unordered_map<int, std::unordered_set<size_t> > _ys;
public:
void add(const std: :pair<int,int>& pt){
const int x = pt.first, y = pt.second;
const size_t ind = _pts.size()。
_pts.push_back(pt)。
_xs[x].insert(ind)。
_ys[y].insert(ind)。
}
size_t count(const std: :pair<int,int>& pt){
std::unordered_set<size_t> intersection;
const int x = pt.first, y = pt.second;
std::set_intersection(_xs[x].begin(), _xs[x].end() 。
_ys[y].begin(), _ys[y].end()。
std::inserter(intersection, intersection.begin())。
return intersection.size()。
}
};
int main() {
計數器c。
c.add({3,10}); // ind == 0
c.add({11,2}); // ind == 1.
c.add({3,2}); // ind == 2.
//到此為止,
// _xs == {3: {0, 2}, 11: {1}}
// _ys == {10: {0}, 2: {1,2}}
std::cout << c.count({3,2}) << std::endl; // should return 1
std::cout << c.count({11,2}) << std::endl; //應回傳1。
}
相反,我得到的是
1
然而,當我用std::unordered_set替換std::set時,結果變成了預期。
std::unordered_set是怎么回事呢?
順便說一下,我的編譯命令是
g -Wall -Wextra -Werror -O3 -std=c 17 -pedantic -fsanitize=address -o main.out main.cpp & & ./main.out
而我的g --version是g (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0。
uj5u.com熱心網友回復:
std::set_intersection 需要有序的元素。
unordered_map和_set不提供有序的元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321863.html
標籤:
