相关疑难解决方法(0)

如何重载std :: swap()

std::swap()在排序甚至分配期间被许多std容器(例如std::liststd::vector)使用.

但是std实现swap()非常普遍,而且对于自定义类型来说效率很低.

因此,通过std::swap()使用自定义类型特定实现进行重载可以获得效率.但是如何实现它以便std容器使用它?

c++ optimization performance stl c++-faq

112
推荐指数
4
解决办法
3万
查看次数

如何为我的班级提供交换功能?

启用swapSTL算法的正确方法是什么?

1)会员swap.是否std::swap使用SFINAE技巧来使用该成员swap.

2)自由站立swap在同一名称空间中.

3)部分专业化std::swap.

4)以上所有.

谢谢.

编辑:看起来我没有清楚地说出我的问题.基本上,我有一个模板类,我需要STL algos来使用我为该类编写的(高效)交换方法.

c++ algorithm swap stl

82
推荐指数
1
解决办法
2万
查看次数

你应该在std命名空间中重载swap吗?

我今天读到一些有趣的内容,说用户提供的类型(作为模板参数提供)调用swap的"标准"方式是......

using std::swap;
swap(something, soemthingelse);
Run Code Online (Sandbox Code Playgroud)

这样做的原因是使用的参数依赖查找要么使用一个swap在用户的命名空间或函数swapstd命名空间.这为我提出了一个感兴趣的问题.当我超载std::swap了我的课之一,我实际上已被定义它的std命名空间... namespace std { void swap(/*...*/){/*...*/} }.这种做法错了吗?我应该定义自己的swaps std或我自己的命名空间(以及为什么)?

c++ stl

20
推荐指数
2
解决办法
3179
查看次数

为用户定义的类型重载全局交换

C++标准禁止在命名空间中声明类型或定义任何内容std,但它允许您为用户定义的类型专门化标准STL模板.

通常,当我想专注std::swap于我自己的自定义模板类型时,我只是这样做:

namespace std
{
  template <class T>
  void swap(MyType<T>& t1, MyType<T>& t2)
  {
     t1.swap(t2);
  }
}
Run Code Online (Sandbox Code Playgroud)

......这很好.但我不完全确定我的惯常做法是否符合标准.我这样做了吗?

c++ standards swap stl

12
推荐指数
1
解决办法
4235
查看次数

如何为我的模板类添加std :: swap?

可能重复:
如何为我的班级提供交换功能?

关于这一点存在一些问题,但是很多矛盾(A人给出了解决方案A',其中有很多人用B表示它是UB)或者"仅在编译器支持ADL时才有效".

所以,假设我有以下模板(容器)类:

template<typename T>
class C {
    // ...
    void swap(C<T>& y) throw(); // C x; x.swap(y);
}
Run Code Online (Sandbox Code Playgroud)

那么确保这个(示例)代码有效的正确方法是什么:

C<int> x, y;
std::swap(x, y);
Run Code Online (Sandbox Code Playgroud)

请给出你对C++ 03的答案,如果它仍然适用于C++ 0x,那就更好了!

c++ swap stl class

5
推荐指数
1
解决办法
1618
查看次数

C++何时可以扩展`std`命名空间?

SO上的一个帖子说扩展std是UB(好吧,除非你当然是标准作者).但不时,std幸福地延长.什么时候可以这样做?

c++ namespaces std c++11

5
推荐指数
1
解决办法
995
查看次数

标签 统计

c++ ×6

stl ×5

swap ×3

algorithm ×1

c++-faq ×1

c++11 ×1

class ×1

namespaces ×1

optimization ×1

performance ×1

standards ×1

std ×1