Nếu bạn phải tiếp tục sử dụng cấu trúc dữ liệu hiện tại của bạn, mà chủ yếu là một std::tuple
ba std::vector
s, sử dụng boost::zip_iterator
sẽ vẻ là con đường để đi. Một zip_iterator
xử lý ba trình lặp (hai đến chỉ mục và một đến một giá trị) dưới dạng một bộ đơn và bạn có thể sử dụng đối tượng hàm so sánh tùy chỉnh để sắp xếp dữ liệu của bạn tại chỗ. Không thể sử dụng, boost::zip_iterator
với std::sort
, như được giải thích trong this Q&A, vì không thể viết được.
Điều này có nghĩa là bạn sẽ phải viết lớp zip_iterator của riêng bạn có thể được sử dụng với std::sort
. Lưu ý rằng đây không phải là bài tập tầm thường, xem this Q&A và/hoặc paper này.
Việc sắp xếp một số std::vector
của số std::tuple
dễ dàng hơn rất nhiều. Nỗ lực của tôi dưới đây sử dụng một số std::tuple
của hai chỉ mục và giá trị, đồng thời lưu trữ các mục đó vào một số std::vector
. Để sắp xếp, tôi sử dụng lambda chung C++ 14 để chuyển tiếp hai chỉ mục vào một bộ nhỏ hơn và so sánh các từ đó theo thứ tự từ điển (ví dụ: đầu tiên trên chỉ mục hàng, sau đó trên cột chỉ mục) bằng cách sử dụng thư viện operator<
của std::tuple
.
#include <algorithm>
#include <iostream>
#include <tuple>
#include <vector>
using index = uint32_t;
using value = float;
using sparse_entry = std::tuple<index, index, value>;
using sparse_matrix = std::vector<sparse_entry>;
int main()
{
// sparse 3x3 matrix
auto m = sparse_matrix {
std::make_tuple(1, 1, -2.2),
std::make_tuple(1, 0, 42 ),
std::make_tuple(0, 2, 3.4),
std::make_tuple(0, 1, 1.7)
};
// sort by row-index, then column-index
std::sort(begin(m), end(m), [](auto const& L, auto const& R) {
return
std::forward_as_tuple(std::get<0>(L), std::get<1>(L)) <
std::forward_as_tuple(std::get<0>(R), std::get<1>(R))
;
});
for (auto const& elem : m)
std::cout << "{ " << std::get<0>(elem) << ", " << std::get<1>(elem) << ", " << std::get<2>(elem) << "}, \n";
}
Live Example.
Nếu ứng dụng của bạn có thể sử dụng bố cục dữ liệu được chuyển đổi này (và có thể có lý do hiệu suất bộ nhớ cache tại sao nó không thể), thì mã trên sẽ thực hiện sắp xếp theo ý bạn.
LƯU Ý: như @ Casey đề cập, bạn cũng có thể sử dụng std::tie
thay vì std::forward_as_tuple
, nhưng điều đó có thể cắn bạn khi bạn thay đổi sparse_entry
vào một lớp người dùng định nghĩa chính thức với thu khí trở bởi giá trị.
Tóm lại, hãy xem phiên bản 3 đối số của 'std :: sort', rồi tra cứu' functor' hoặc 'đối tượng hàm'. – PaulMcKenzie
Vì vậy, bạn cần trợ giúp - nếu tôi cung cấp cho bạn hai giá trị giá trị (i, j, k), hãy cho chúng tôi biết cách bạn sẽ xác định xem giá trị đầu tiên có xuất hiện trước giá trị thứ hai hay không. Ngoài ra hình thức này là "bảng" là gì? Bạn cần cho chúng tôi biết chi tiết hơn một chút về cách dữ liệu này được cấu trúc như thế nào. – PaulMcKenzie
Vì vậy, bạn muốn tất cả ba mảng được sắp xếp? Cách dễ nhất là kết hợp tất cả chúng thành một 'struct' và chỉ có một mảng duy nhất thuộc loại đó. –