2015-11-18 25 views
5

Có một giải pháp lót (hoặc một vòng lặp đơn giản) để sắp xếp một véc tơ bằng các chỉ số chẵn và lẻ của nó không? Ví dụ:Sắp xếp vectơ theo chỉ số chẵn và lẻ. C++

long entries[] = {0,1,2,10,11}; // indices 0 1 2 3 4 
std::vector<long> vExample(entries, entries + sizeof(entries)/sizeof(long)); 

vExample.sortEvenOdd(vExample.begin(),vExample.end()); // magic one liner I wish existed... 

for (int i = 0; i < vExample.size(); i++) 
{ 
    std::cout << vExample[i] << " "; 
} 

Bây giờ tôi muốn có kết quả như sau:

0 2 11 1 10 // corresponding to indices 0 2 4 1 3 
+2

sử dụng 'std :: end (mục)' thay vì biểu thức dài tính toán nó – Slava

+2

điều này cũng hoạt động: 'std :: vector vExample {0,1,2,10,11}' – anatolyg

+1

Nếu bạn có thể sử dụng Boost, [' boost.strided'] (http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/adaptors/reference/strided.html) là tất cả những gì bạn cần. Bằng cách đó bạn thậm chí sẽ không phải thực sự sắp xếp lại véc-tơ, điều này có thể giúp thực hiện. –

Trả lời

4

tôi đã cố gắng để làm một thực lót:

std::stable_partition(std::begin(input), std::end(input), 
         [&input](int const& a){return 0==((&a-&input[0])%2);}); 

Và đây là toàn bộ chương trình:

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

int main() { 
    std::vector<int> input {0,1,2,10,11}; 

    std::stable_partition(std::begin(input), std::end(input), 
         [&input](int const& a){return 0==((&a-&input[0])%2);}); 

    for (auto v : input) 
    std::cout << v << " "; 
} 

Ok Tôi biết, nó hoạt động với lý do duy nhất mà sử dụng vector một mảng liền kề của các mặt hàng và toàn bộ điều là bẩn ... Nhưng đối với đó là một lớp lót như được hỏi bởi OP và nó không yêu cầu bất cứ điều gì thêm như tăng ...

-1

gì bạn cần là stable_partition. Xác định một biến vị ngữ kiểm tra xem chỉ số có sử dụng modulo 2 hay không và bạn có thể thực hiện tốt hay không.

+0

'stable_partition' hoạt động bằng cách hoán đổi; nó sẽ trở nên bối rối khi chỉ mục của một phần tử thay đổi? – anatolyg

+2

Bạn có thể đưa ra ví dụ về vị từ này không? –

+0

Câu trả lời này khá không đầy đủ, không rõ ràng cách thực hiện điều này với 'stable_partition'. –

1

Đây không phải là một trong lót nhưng khá chặt chẽ:

long entries[] = {0,1,2,10,11}; // indices 0 1 2 3 4 
std::vector<long> vExample; 
for(bool flag : { true, false }) { 
    auto cond = [&flag](long) { flag = !flag; return !flag; }; 
    std::copy_if(std::begin(entries), std::end(entries), std::back_inserter(vExample), cond); 
} 
1

Nếu bạn có thể sử dụng Boost, điều này là khá ngắn gọn:

#include <boost/range/adaptor/strided.hpp> 
#include <boost/range/adaptor/sliced.hpp> 
#include <boost/range/algorithm_ext/push_back.hpp> 
#include <iostream> 
#include <vector> 

int main() { 
    using namespace boost::adaptors; 

    std::vector<int> input {0,1,2,10,11}; 
    std::vector<int> partitioned; 

    boost::push_back(partitioned, input | strided(2)); 
    boost::push_back(partitioned, input | sliced(1, input.size()) | strided(2)); 

    for (auto v : partitioned) 
     std::cout << v << " "; 
} 

Bạn có thể dĩ nhiên quấn rằng trong một chức năng để có được một một lớp lót trong mã gọi. Live

Các vấn đề liên quan