2012-12-20 20 views
5

Tôi đang tìm một lớp C++ có thể duy trì danh sách các chiều dài 1 chiều.Cần thiết: Lớp C++ để duy trì danh sách các chiều dài 1 chiều

Mỗi phạm vi được định nghĩa là một cặp (start,len).

Tôi muốn có thể thêm các phần bổ sung vào danh sách và để chúng tự động hợp nhất. Tức là, nếu chúng tôi có (0,5)(10,5) trong danh sách và (5,5) được thêm vào, danh sách mới chỉ nên chứa (0,15).

Không bao giờ bị xóa khỏi danh sách.

Có điều gì như thế này tồn tại không?

Cảm ơn.

Trả lời

5

Bạn đang tìm kiếm Boost.Icl. Nó thực hiện chính xác những gì bạn mô tả.

http://www.boost.org/doc/libs/1_52_0/libs/icl/doc/html/index.html

+0

Nó không rõ ràng với tôi nếu Boost.lcl sẽ kết hợp mức độ liền kề. Bạn có biết chắc chắn rằng nó không? Chúng ta sẽ có hàng trăm hàng ngàn phần tiếp giáp. – vy32

+0

Có nó sẽ. Tôi sử dụng nó theo cách này mọi lúc. Kiểm tra trang này: http: //www.boost.org/doc/libs/1_52_0/libs/icl/doc/html/index.html#boost_icl.introduction.interval_combining_styles – Zeks

+0

Tuyệt vời. Cảm ơn! Đó chỉ là những gì tôi cần. – vy32

2

Dưới đây là một ví dụ về thực hiện một container khoảng đơn giản:

#include <iostream> 
#include <vector> 
#include <memory> 
#include <algorithm> 

using std::vector; 
using std::pair; 
using std::make_pair; 

typedef pair<int, int> interval;  

struct interval_container 
{ 
    void add(int start, int len) 
    { 
     _data.emplace_back(make_pair(start, len)); 
    } 

    void consolidate() 
    { 
     // sort intervals first by start then by length 
     std::sort(_data.begin(), _data.end()); 

     // create temp data 
     vector<interval> consolidated; 

     // iterate over all sorted intervals 
     for(const interval& i : _data) 
     { 
      int start = i.first; 
      int len = i.second; 

      // special case: first interval 
      if (consolidated.empty()) 
      { 
       consolidated.emplace_back(i); 
      } 
      // all other cases 
      else 
      { 
       // get last interval in the consolidated array 
       interval& last = consolidated.back(); 
       int& last_start = last.first; 
       int& last_len = last.second; 


       // if the current interval can be merged with the last one 
       if ((start >= last_start) and (start < (last_start + last_len))) 
       { 
        // merge the interval with the last one 
        last_len = std::max(last_len, (start + len - last_start)); 
       } 
       // if the current interval can't be merged with the last one 
       else 
       { 
        consolidated.emplace_back(i); 
       } 
      } 
     } 

     // copy consolidated data 
     _data = consolidated; 
    } 


    vector<interval>& data() { return _data; } 

private: 
    vector<interval> _data; 
}; 


int main() 
{ 
    interval_container intervals; 

    intervals.add(0, 2); 
    intervals.add(1, 3); 
    intervals.add(5, 3); 

    intervals.consolidate(); 

    int c(0); 
    for(interval i : intervals.data()) 
    { 
     std::cout << (c++) << ": from " << i.first << " to " << (i.first + i.second) << std::endl; 
    } 
} 
+0

Cảm ơn. Câu hỏi --- Tôi đã thấy một nhóm người định nghĩa các lớp với 'struct', như bạn có ở đây, chứ không phải với khai báo lớp C++ thích hợp. Tại sao xác định một lớp như một cấu trúc? – vy32

+1

Xem [tại đây] (http://stackoverflow.com/questions/92859/what-are-the-differences-between-struct-and-class-in-c) cho một câu hỏi SO liên quan đến sự khác biệt giữa cấu trúc và lớp. Cá nhân, tôi làm điều đó bởi vì tôi luôn luôn tuyên bố phương pháp công khai trên đầu trang của lớp và tôi không muốn luôn luôn gõ 'công khai:'. Với thời gian nó đã trở thành một thói quen. – Gigi

+0

Huh. Đuợc. Cảm ơn. – vy32