Mỗi bộ chứa các phần tử theo thứ tự được chỉ định. Tôi muốn chỉ định một giới hạn về kích thước của một bộ và tự động xóa xóa phần tử cuối cùng nếu một phần tử mới hoàn toàn nhỏ hơn (theo thứ tự) được chèn và kích thước đã chỉ định đã đạt được.Làm cách nào để chèn một giá trị mới vào một tập hợp và xóa một giá trị khác cùng một lúc?
Tất nhiên, tôi có thể làm một cái gì đó như sau:
class bounded_set
{
private:
using set = std::set<Key, Compare, Allocator>;
using iterator = typename set::iterator;
public:
bounded_set(std::size_t size)
: m_size(size)
{ }
std::pair<iterator, bool> insert(Key const& value)
{
if (m_set.size() < m_size)
return m_set.insert(value);
auto last = std::prev(m_set.end());
if (Compare()(value, *last))
{
m_set.erase(last);
return m_set.insert(value);
}
return std::make_pair(last, false);
}
private:
set m_set;
std::size_t m_size;
};
Bên cạnh thực tế, rằng bounded_set
không phải là tên tốt nhất (kể từ giáp container là một điều nổi tiếng trong thế giới của lập trình đồng thời), Tôi lo lắng về việc cấp phát bộ nhớ trong việc triển khai này. Nhiều khả năng, lúc đầu, không gian được sử dụng bởi last
sẽ được giải phóng. Nhưng ngay sau đó, bộ nhớ mới cần được phân bổ cho value
.
Điều tôi thực sự muốn làm là sử dụng bộ nhớ được phân bổ cho last
và sao chép dữ liệu cho value
đến địa điểm này, trong khi vẫn giữ thứ tự.
Có thể bạn có thể thay thế tập hợp của mình bằng vectơ. Trừ khi tập dữ liệu của bạn là rất lớn và các khóa có bản sao đắt tiền mà không có di chuyển rẻ, hiệu suất sẽ không bị suy giảm và thực sự có thể nhanh hơn vì vectơ có phân bổ bộ nhớ động ít hơn một bộ. Nếu bạn giữ vectơ của bạn được sắp xếp, bạn có thể sử dụng 'std :: lower_bound' trên nó để tìm kiếm log (n). Tất nhiên bạn sẽ cần phải kiểm tra xem vector đã giữ giá trị trước khi chèn vv. Wrap công cụ này trong một lớp "flat_set". –