Cho một vector của N
các phần tử v = (1, 2, 3, 4, ... , N)
trình lặp lại phạm vi trả về trên tất cả các khối có kích thước K<N
. Phạm vi cuối cùng có thể nhỏ hơn K
nếu N%K!=0
.Chia thùng chứa thành các khối, C++
Ví dụ:
v = ("a","b","c","d","e")
hiển thị chuỗi
"ab", "cd", "e"
N=v.size();
K=2;
Một giải pháp khả thi là:
for(unsigned int i=0; i<v.size(); i+=K)
cout << boost::join(v | boost::adaptors::sliced(i, min(i+K, v.size())), "");
Giải pháp này là khá ok nhưng nó có một số vấn đề:
for
vòng lặp - có cần thiết không?- nếu bạn viết
i+K
thay vìmin(i+K, v.size())
thuật toán bị nghiền nát, bạn cần chú ý thêm đến trường hợp biên. Điều này có vẻ xấu xí và phân tâm.
Bạn có thể đề xuất giải pháp thanh lịch hơn không? Bởi giải pháp thanh lịch, tôi có nghĩa là việc sử dụng một thuật toán chung, xây dựng trong hoặc được cung cấp bởi thư viện thường được sử dụng (chẳng hạn như tăng).
-------------------------- [edit] ----------------- ---------
Một số trong số các bạn đã làm ví dụ làm việc ở đây.
#include <iostream>
#include <vector>
#include <string>
#include <boost/range/adaptor/sliced.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/assign.hpp> //just for fun
using namespace std;
using namespace boost::assign;
int main(int , char **)
{
const int K = 2;
vector<string> v;
v += "a","b","c","d","e";
for(unsigned int i=0; i<v.size(); i+=K)
cout << boost::algorithm::join(
v | boost::adaptors::sliced(i, min(i+K, v.size())), "")
<< endl;
}
Output:
ab
cd
e
tại sao bạn không đăng ví dụ đầy đủ? –
@VJovic trong ví dụ tôi đã cho thấy những gì tôi thực sự cần nhưng đây là câu hỏi tổng quát hơn, làm thế nào để chạy một thuật toán trên mỗi đoạn của một container riêng biệt. – bartek
Thật không may, tôi không thể biên dịch ví dụ của bạn, và tôi đã mất quả cầu pha lê của mình;) –