std::swap()在排序甚至分配期间被许多std容器(例如std::list和std::vector)使用.
但是std实现swap()非常普遍,而且对于自定义类型来说效率很低.
因此,通过std::swap()使用自定义类型特定实现进行重载可以获得效率.但是如何实现它以便std容器使用它?
我正在研究这个关于实现用户定义类型函数的最佳实践的微妙问题的这个有趣的答案.(我的问题最初的动机是讨论将名称添加到命名空间的非法性.)swapstd
我不会在这里重新打印上面链接的答案中的代码片段.
相反,我想了解答案.
答案我上面的状态联系在一起,第一代码片段之下,在关于超载swap的namespace std(而不是专门在的命名空间):
如果您的编译器打印出不同的东西,那么它就不能正确地为模板实现"两阶段查找".
然后答案指出,专门swap研究namespace std(而不是重载它)会产生不同的结果(在专业化的情况下是期望的结果).
但是,答案继续进行另外一种情况:为用户定义的模板类专门交换 - 在这种情况下,再次无法实现所需的结果.
不幸的是,答案只是陈述事实; 它没有解释原因.
有人可以详细说明这个答案,并在该答案中提供的两个特定代码片段中描述查找过程:
过载swap在namespace std为用户定义的非模板类(如在联答复的第一代码段)
专注swap于namespace std用户定义的模板类(如链接答案的最终代码段)
在这两种情况下,std::swap都会调用泛型,而不是用户定义的泛型swap.为什么?
(这将阐明两阶段查找的本质,以及实现用户定义swap的最佳实践的原因;谢谢.)
我在名为'filter.h'的头文件中有以下方法:
namespace std{
//some code
template <class T, class S, class BorderMethod>
tImage<T> binomial(const tImage<T> &in, const size_t k = 3) {
//do some computations
tImage<T> img = in.convolve<T, BorderMethod>(in, kernel);
return img;
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到的第一件事:这个方法的定义发生在header-file中.这是标准程序吗?
现在,实际问题:convolve即使in拥有这样的方法,对方法的调用也不会起作用.这是convolve类中方法的定义tImage<T>:
tImage<T> convolve(const gravis::tImage<T>& image, const gravis::tArray<typename tImageTraits<T>::Float_t>& kernel);
Run Code Online (Sandbox Code Playgroud)
我该如何调用此功能?
SO上的一个帖子说扩展std是UB(好吧,除非你当然是标准作者).但不时,std幸福地延长.什么时候可以这样做?
我以前输错了错误信息.现在修好了.
我目前收到以下编译器错误消息
error: no match for 'operator<<' in 'std::cout << Collection::operator[](int)(j)'
Run Code Online (Sandbox Code Playgroud)
编译器抱怨的代码是
cout << testingSet[j];
Run Code Online (Sandbox Code Playgroud)
哪个testingSet类型的对象Collection已operator[]重载以返回类型的对象Example. Example有一个operator<<为ostream和Example 重载的友元函数.
注意:这实际上在Visual Studio中编译得很好; 但是不使用g ++编译.
这是执行operator<<:
ostream& operator<<(ostream &strm, Example &ex)
{
strm << endl << endl;
strm << "{ ";
map<string, string>::iterator attrib;
for(attrib = ex.attributes.begin(); attrib != ex.attributes.end(); ++attrib)
{
strm << "(" << attrib->first << " = " << attrib->second << "), ";
}
return strm << …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
#ifndef DATE_H_
#define DATE_H_
namespace std {
class Date {
public:
Date();
virtual ~Date();
};
} /* namespace std */
#endif /* DATE_H_ */
Run Code Online (Sandbox Code Playgroud)
我为我的作业创建了课程日期,并创建了namespace std{......}.我不知道它的用途.为什么它不像往常一样写有use namespace std;
什么区别?
c++ ×6
c++11 ×2
templates ×2
c++-faq ×1
compilation ×1
methods ×1
namespaces ×1
optimization ×1
performance ×1
std ×1
stdio ×1
stl ×1
swap ×1