【问题标题】:C++/WinRT : Sorting a IObservableVector<T>C++/WinRT:对 IObservableVector<T> 进行排序
【发布时间】:2021-06-27 07:31:57
【问题描述】:

有没有一种方法可以直接对winrt::Windows::Foundation::Collections::IObservableVector&lt;T&gt; 进行排序,而无需创建新向量或将其转换为std::vector&lt;T&gt;

IObservableVector<int> numbers{ single_threaded_observable_vector<int>() };
numbers.Append(5);
numbers.Append(1);
numbers.Append(3);

std::sort(numbers.begin(), numbers.end());

std::sort 似乎不适用于 C++/WinRT 集合,至少对我来说是这样。

我的进一步目标是在GridView 中显示复杂对象的排序和过滤集合。

如果无法直接排序,将IObservableVector&lt;T&gt; 转换为std::vector&lt;T&gt; 的最有效方法是什么?反之亦然很简单single_threaded_observable_vector&lt;T&gt;(std::move(vec))

编辑:

根据Raymond Chen's blog,可以使用IVector&lt;T&gt;.GetMany(UInt32, T[])IVector&lt;T&gt; 复制到std::vector&lt;T&gt;

std::vector<int> vec(numbers.Size());
numbers.GetMany(0, vec);

但是,我仍然不确定在生产应用中复制大型集合的性能。希望有更好的方法。

【问题讨论】:

  • 在不创建新向量或将其转换为 std::vector 的情况下,无法直接对 winrt::Windows::Foundation::Collections::IObservableVector 进行排序。

标签: c++ windows uwp windows-runtime c++-winrt


【解决方案1】:

没错,std::sort 仅适用于可迭代集合。但是您可以使用 IVector 的方法GetAtSetAt 在 IVector 上实现排序功能。

但将其复制到std::vector 是一种更简单的解决方法。不用担心复制成本。对向量进行排序需要 O(n lg n) 次交换,这比 O(n) 复制要慢几倍。额外的费用可以忽略。

当单个数据对象的大小很大而向量的长度不大时,确实可以间接解决这个问题:初始化一个数组id:id[i] = i,通过比较vector[id[i]]vector[id[j]]进行排序(至少 IVector 支持随机访问),那么你已经有了“排序向量”。那是因为 id[i] 是第 i 个元素的索引。您可以通过vector[id[...]]访问新的排序向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2011-06-11
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多