我意识到std::sort函数需要使用随机访问迭代器,列表有双向迭代器。关于这一点,有一个问题是:
Sort list using STL sort function
为了家庭学习的目的,我正在努力回答加速C++书中的问题5-4。
5-4。再次看看您在上一次练习中编写的驱动程序函数。请注意,可以编写只在保存输入文件的数据结构的类型声明中不同的驱动程序。如果您的向量和列表测试驱动程序以任何其他方式不同,则重写它们,使它们仅在此声明中有所不同。
除了这个教科书上的问题,如果我使用模板而不是ty胡枝子来定义容器类型,这将是很有用的。
(请注意,这种情况可能会发生在代词审查者:apology/上)
发布于 2014-03-31 01:24:14
使用相同的命令...sorts列表还是向量?
最简单的方法是使用重载:
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(); }
更新
你暗示你的文本还没有引入模板,所以这里有一个没有模板的替代方案。问题是“只在保存输入文件的数据结构的类型声明中有所不同”,我们正在讨论的是vector
和list
,所以必须有如下内容:
std::vector<std::string> input;
也许类型不是std::string
--您可能有自己的数据类型--但无论是什么类型,标准容器--包括vector
和list
--都有一个typedef
,这样就可以将包含的类型引用到la decltype<input>::value_type
。这意味着您可以编写只适用于具有特定值类型的vector
和list
的模板的更严格的版本:
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
或任何当前的值类型,这也会很好--从维护的角度来看,唯一的问题是,如果以后更改值类型,则需要更改此代码。
inline void sort(std::vector<std::string>& x) { std::sort(x.begin(), x.end()); }
inline void sort(std::list<std::string>& x) { x.sort(); }
发布于 2014-03-31 01:47:11
既然简单的方法已经被回答了,让我指出困难的方法:
#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;
}
现在,如果您只想区分list
和vector
,那么上面的内容就太过分了。只在需要通过类型机制实现标记调度时才使用,这种机制将扩展到实现某些迭代器概念的任意容器。
这种方式(例如排序std::array
或std::deque
)不需要额外的重载,因为它们的迭代器可以指向正确的调度结构。
https://stackoverflow.com/questions/22752137
复制相似问题