Tôi có hai bộ (std :: đặt từ <set>
) trong đó tôi muốn biết kích thước của giao lộ. Tôi có thể sử dụng std :: set_intersection từ <algorithm>
, nhưng tôi phải cung cấp cho nó một bộ lặp đầu ra để sao chép giao lộ vào một số vùng chứa khác.Cách tính kích thước giao điểm của hai bộ STL trong C++
Một cách đơn giản sẽ là
set<int> s1{1,2,3,4,5};
set<int> s2{4,5,6,7,8,9,0,1};
vector<int> v;
set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(v, v.begin()));
sau đó v.size() cung cấp cho các kích thước của giao lộ. Tuy nhiên, giao lộ cũng sẽ được lưu trữ, mặc dù chúng tôi không làm gì với nó.
Để tránh điều đó, tôi cố gắng thực hiện một lớp đầu ra iterator giả, mà chỉ đếm, nhưng nó không gán:
template<typename T>
class CountingOutputIterator {
private:
int* counter_;
T dummy_;
public:
explicit CountingOutputIterator(int* counter) :counter_(counter) {}
T& operator*() {return dummy_;}
CountingOutputIterator& operator++() { // ++t
(*counter_)++;
return *this;
}
CountingOutputIterator operator++(int) { // t++
CountingOutputIterator ret(*this);
(*counter_)++;
return ret;
}
bool operator==(const CountingOutputIterator& c) {
return counter_ == c.counter_; // same pointer
}
bool operator!=(const CountingOutputIterator& c) {
return !operator==(c);
}
};
sử dụng mà chúng tôi có thể làm
set<int> s1{1,2,3,4,5};
set<int> s2{4,5,6,7,8,9,0,1};
int counter = 0;
CountingOutputIterator<int> counter_it(&counter);
set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(), counter_it);
sau đó bộ đếm giữ kích thước của giao lộ.
Tuy nhiên, đây là mã nhiều hơn nữa. Câu hỏi của tôi là:
1) Có cách nào (thư viện) tiêu chuẩn hoặc thủ thuật tiêu chuẩn để có được kích thước giao lộ mà không lưu trữ toàn bộ giao lộ không? 2) Không phụ thuộc vào việc có hay không, là cách tiếp cận với trình lặp giả định tùy chỉnh hay không?
Dường như quá phức tạp để chỉ xác định số phần tử phổ biến. Tại sao không chỉ sử dụng một vòng lặp? – Aldehir
Rất lạ, điểm của việc biết kích thước khi bạn không bao giờ thực sự sử dụng giao lộ là gì? Bạn đang nghĩ về điều này rõ ràng? [Đọc này] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –
Thay vì một trình vòng lặp tùy chỉnh, nó sẽ đơn giản hơn để tạo một "thùng chứa" tùy chỉnh có một thành viên 'insert()' đếm và sử dụng 'insert_iterator' với điều đó. –