首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Acclerated C++:我能用同一个命令编写一个排序列表或向量的程序吗?

Acclerated C++:我能用同一个命令编写一个排序列表或向量的程序吗?
EN

Stack Overflow用户
提问于 2014-03-31 01:09:45
回答 2查看 194关注 0票数 4

我意识到std::sort函数需要使用随机访问迭代器,列表有双向迭代器。关于这一点,有一个问题是:

Sort list using STL sort function

为了家庭学习的目的,我正在努力回答加速C++书中的问题5-4。

5-4。再次看看您在上一次练习中编写的驱动程序函数。请注意,可以编写只在保存输入文件的数据结构的类型声明中不同的驱动程序。如果您的向量和列表测试驱动程序以任何其他方式不同,则重写它们,使它们仅在此声明中有所不同。

除了这个教科书上的问题,如果我使用模板而不是ty胡枝子来定义容器类型,这将是很有用的。

(请注意,这种情况可能会发生在代词审查者:apology/上)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-31 01:24:14

使用相同的命令...sorts列表还是向量?

最简单的方法是使用重载:

代码语言:javascript
运行
复制
template <typename T>
inline void sort(std::vector<T>& x) { std::sort(x.begin(), x.end()); }

template <typename T>
inline void sort(std::list<T>& x) { x.sort(); }

更新

你暗示你的文本还没有引入模板,所以这里有一个没有模板的替代方案。问题是“只在保存输入文件的数据结构的类型声明中有所不同”,我们正在讨论的是vectorlist,所以必须有如下内容:

代码语言:javascript
运行
复制
std::vector<std::string> input;

也许类型不是std::string --您可能有自己的数据类型--但无论是什么类型,标准容器--包括vectorlist --都有一个typedef,这样就可以将包含的类型引用到la decltype<input>::value_type。这意味着您可以编写只适用于具有特定值类型的vectorlist的模板的更严格的版本:

代码语言:javascript
运行
复制
inline void sort(std::vector<decltype<input>::value_type>& x) { std::sort(x.begin(), x.end()); }

inline void sort(std::list<decltype<input>::value_type>& x) { x.sort(); }

当然,如果您只想硬编码std::string或任何当前的值类型,这也会很好--从维护的角度来看,唯一的问题是,如果以后更改值类型,则需要更改此代码。

代码语言:javascript
运行
复制
inline void sort(std::vector<std::string>& x) { std::sort(x.begin(), x.end()); }

inline void sort(std::list<std::string>& x) { x.sort(); }
票数 9
EN

Stack Overflow用户

发布于 2014-03-31 01:47:11

既然简单的方法已经被回答了,让我指出困难的方法:

代码语言:javascript
运行
复制
#include <algorithm>
#include <iterator>
#include <list>
#include <vector>

template <typename IterType>
struct sort
{
    template<typename Cont, typename Comp>
    inline static void impl(Cont &container, Comp F) {
        container.sort(F);
    }
    template<typename Cont>
    inline static void impl(Cont &container) {
        container.sort();
    }
};

template <>
struct sort<std::random_access_iterator_tag>
{
    template<typename Cont, typename Comp>
    inline static void impl(Cont &container, Comp F) {
        std::sort(std::begin(container), std::end(container), F);
    }
    template<typename Cont>
    inline static void impl(Cont &container) {
        std::sort(std::begin(container), std::end(container));
    }
};

template<typename Cont>
void Sort(Cont &container) {
    sort<typename std::iterator_traits<typename Cont::iterator
        >::iterator_category>::impl(container);
}

template<typename Cont, typename Comp>
void Sort(Cont &container, Comp F) {
    sort<typename std::iterator_traits<typename Cont::iterator
        >::iterator_category>::impl(container, F);
}

int main ()
{
    std::list<int> ml;
    std::vector<int> mv;

    Sort(ml);
    Sort(mv);
    Sort(ml, [](int a, int b) { return a > b; });
    Sort(mv, [](int a, int b) { return a > b; });

    return 0;
}

现在,如果您只想区分listvector,那么上面的内容就太过分了。只在需要通过类型机制实现标记调度时才使用,这种机制将扩展到实现某些迭代器概念的任意容器

这种方式(例如排序std::arraystd::deque )不需要额外的重载,因为它们的迭代器可以指向正确的调度结构。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22752137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档