GVKun编程网logo

如何重载 std::swap()(如何重载运算符)

21

对于如何重载std::swap()感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍如何重载运算符,并为您提供关于Androidswap分区作用及swapper软件设置方法、Arrays类中的.t

对于如何重载 std::swap()感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍如何重载运算符,并为您提供关于Android swap 分区作用及 swapper 软件设置方法、Arrays 类中的 .toString() 是如何重载的、bash:如何重定向stdin / stderr然后再恢复fd?、c – std :: map :: erase() – 哪个重载更快?的有用信息。

本文目录一览:

如何重载 std::swap()(如何重载运算符)

如何重载 std::swap()(如何重载运算符)

std::swap()`在排序甚至赋值期间被许多 std 容器(例如`std::list`and )使用。`std::vector

但是 std 的实现swap()非常笼统,对于自定义类型来说效率很低。

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

答案1

小编典典

重载std::swap实现(也就是专门化它)的正确方法是将它写在与你交换的相同的命名空间中,以便可以通过参数相关查找(ADL)找到它。一件特别容易做的事情是:

class X{    // ...    friend void swap(X& a, X& b)    {        using std::swap; // bring in swap for built-in types        swap(a.base1, b.base1);        swap(a.base2, b.base2);        // ...        swap(a.member1, b.member1);        swap(a.member2, b.member2);        // ...    }};

Android swap 分区作用及 swapper 软件设置方法

Android swap 分区作用及 swapper 软件设置方法

最近折腾 android 系统比较多,也有了些心的,故有了这篇文章。
  android 的 swap 分区与 linux 相同,都是用于数据交换的,类似于 windows 上的虚拟内存。合理设置 swap 能提升系统的速度,降低系统因内存不足而关闭后台程序的频率。但如果设置不当,反而会拖慢系统速度,影响使用体验。

  本文就从 android 内存管理机制出发,介绍合理设置 swap 的方法。由于本人并不是开发者,对 android 的内存管理机制的理解可能有偏差的地方,欢迎指证,废话不多,lets go。

  一、android 的内存管理机制

  我们知道 android 的程序都是没有关闭键的,所有大部分程序推出后还是有一部分数据驻留在内存里。但内存不可能无限大,打开程序一多,又都不完全退出,时间一长,再大的内存也是不够用的,更何况 hero 的可用内存仅 192mb (总内存 288mb,96mb 被 radio 占用,另外的 192mb 系统可用),去掉 os 占掉的部分,真正可获得的内存不到 140mb,随便用用,内存就耗完了。

  当系统内存不足时内存管理机制就开始起作用了,会在程序列表里选择长时间空闲的程序予以关闭,以保证系统的运行速度。这种机制在大部分时间里都运行得不错。但有些比较让人恼火的地方在于,并不是所有的程序被关闭时都保存现场的,比如浏览器。

  在最坏的情况里,你正在浏览器里更新你的博客,这时突然来了个电话,打完电话后你发现浏览器因为内存不足而被强制关闭了,当你再打开浏览器时,赫然出现的是浏览器主页的时候,那真是叫天天不应,叫地地不灵了。当然这种情况不会经常发生,即便发生了有时你的损失也仅仅是那些打开的标签页,但这种问题是切实存在的。

  二、什么是 swap?swap 有什么用?

  前文说道,swap 分区类似于 windows 的虚拟内存,是将 sd 卡上的空间作为系统内存的补充。它的优缺点也跟虚拟内存类似,可以让系统同时运行很多的程序或者对内存需求更大的程序,但读写的速度大大低于物理内存。

  由于 sd 卡的速度较慢,在卡内的 swap 主要作用是建立一个交换空间,当有较大内存需求的软件 (如电话、相机等) 突然运行时,可以将后台程序先暂存在 swap 分区里,待该软件使用完毕,内存又有空余的时候,再将 swap 内的程序数据转到内存里,以降低程序被关闭的可能。

  有一点需要注意的是,开启 甲状腺后,并不是说程序不会被关闭了,而是说被关闭的几率变小了。

  三、给 sd 卡分区

  使用 swap 的花需要给 sd 卡分区,1.5.2 的 RA Recovery 就自带给 sd 卡分区的功能,直接选择 Partition sdcard,并一路按 home 即可。



  recovery 主界面,选择 Partition sdcard 即可对 sd 卡进行分区



  在子菜单里,选择 Partiton SD 即开始对 SD 卡分区操作

  第一个 32mb 是设置 swap 分区大小,第二个 512mb 是设置 ext 分区的大小,用作 app2sd。



  第一个 Swap-size 的大小即 Swap 分区的大小。使用轨迹球上下滚动即可调节分区大小。设置为 0 即不分此分区。一般使用默认即可。



  第二个 Ext2-size 即 ext 分区的大小,用来将程序装在卡上,也可以用轨迹球上下滚动调节大小,一般也是默认即可

  分区完成后,选择 ext2 to ext3 升级拉的文件系统,以加快卡的读取速度。



  注意不要升级到 ext4 分区,1.5.2 的 recovery 对 ext4 的支持不好,会导致 手机无法通过 nand 备份和恢复系统,所以只要升级到 ext3 即可

  升级结束后,选择 reboot system now 重启系统即可。

  四、swapper 软件的使用

  要开始使用 swap 分区的话,需要先下载 swapper 软件,在电子市场里直接有下载,免费的,直接搜索即可。

  Swapper 软件图标



  swapper 软件除了可以开启使用 swap 分区外,还能在卡上建立 swap 文件,方便 sd 卡没分区的用户使用。但由于在卡内使用 swap 时,每次连接电脑加载 sd 卡后,再次取消加载就会显示 sd 卡损坏,必须重启才能恢复,较为麻烦,所以还是建议使用 swap 分区。

  swapper 默认使用卡内 swap 需要在设置,高级设置里勾选使用 swap 分区。选中后返回 swap 的主界面,选择打开 swap 即可。至此,你已经成功建立并开始了 swap。



  swapper 软件的主界面,由于默认不是使用 swap 分区,故点击设置进行更改



  点击设置后会出现 Swapper 的首选项界面,点击高级选项



  在高级设置里,勾选 “使用 SWAP” 分区,即可开启 SD 卡里的 SWAP 分区的使用



  回到主界面,点击 Swap ON,出现 All done 后,即可开启 swap 分区



  点击获取信息,即出现了 Swap 分区和内存使用情况的信息,这里看到 swap 分区总大小 32MB

  后记

  swap 分区不宜过大,因为 sd 卡的读取速度实在太慢,设置太大的话,会有太多数据滞留在卡内,拖慢慢系统速度。笔者曾经就设置过 288mb 的 swap,应用程序 甲状腺是很少关闭了,但使用时间一长,会导致机器卡到完全无法操作,因为太多数据滞留在 SD 卡里,SD 卡的读卡速度是系统的最大瓶颈,这时必须手动关闭程序释放内存才能正常使用,这样就得不偿失了,所以大家还是要按照自己的使用需求,合理设置 swap 大小和 swappness 的数值。

Arrays 类中的 .toString() 是如何重载的

Arrays 类中的 .toString() 是如何重载的

如何解决Arrays 类中的 .toString() 是如何重载的?

我遇到了一个方法不能同时被覆盖和重载的概念。但是当我使用 Arrays.toString() 时,

image1

如果我错了,请纠正我,但是 toString() 方法已同时被覆盖和重载。这怎么可能?

解决方法

当您在子类中具有完全相同的方法签名时,您将被覆盖。当您有两个具有不同类型或数量的参数的相同命名方法时,您正在重载。您可以覆盖一个方法,然后重载它,但是您可以编写一个方法,并且当您重载它时,您最终会覆盖一个超类方法。一件事不排除另一件事。

让我们有一个像这样的超级类:

public class Super {

    public void testMethod() {}

    // Overload
    public void testMethod(String param) {}
}

然后用这样的子类扩展它:

public class Sub extends Super {

    // Override only
    @Override
    public void testMethod() {}

    // Overload only
    public void testMethod(int param) {}

    // Overload and Override
    @Override
    public void testMethod(String param) {}
}

如您所见,您可以通过多种方式仅重载、仅覆盖或两者兼而有之。如前所述,一件事不排除另一件事。

bash:如何重定向stdin / stderr然后再恢复fd?

bash:如何重定向stdin / stderr然后再恢复fd?

我想要一个脚本将stdin和stderr重定向到一个文件,做一堆东西,然后撤消那些重定向并对文件内容采取行动.我尝试着:
function redirect(){
   exec 3>&1
   exec 4>&2
   exec 1>outfile 2>&1
}
function undirect(){
   exec 1>&3
   exec 2>&4
}
echo first
redirect
echo something
cat kjkk
undirect
if some_predicate outfile; then echo ERROR; fi

这似乎做我想要的,但似乎相当复杂.是否有更清洁/更清晰的方法来做到这一点?

如果你真的需要来回切换它,而不事先知道将会在何时何地发生,这几乎就是这样做的.根据您的要求,尽管隔离需要重定向的部件并将其作为组执行可能更为简洁,如下所示:
echo first
{
  echo something
  cat kjkk
} 1>outfile 2>&1
if some_predicate outfile; then echo ERROR; fi

{}称为组命令,重定向整个组的输出.如果您愿意,可以在子shell中执行您的执行,因为它只会影响子shell.

echo first
(
  exec 1>outfile 2>&1

  echo something
  cat kjkk
)
if some_predicate outfile; then echo ERROR; fi

请注意,我在这里使用括号()而不是大括号{}(在第一个示例中使用).

HTH

c – std :: map :: erase() – 哪个重载更快?

c – std :: map :: erase() – 哪个重载更快?

map :: erase()方法有两个重载来删除单个项:

void erase ( iterator position );
size_type erase ( const key_type& x );

我需要检查哪个版本可能更快 – 我的猜测是第一个,因为第二个可能需要调用map :: find()来查找迭代器?

谁能确认一下?

谢谢!

解决方法

第一个是摊销的常数复杂性,第二个是对数.常数项不太可能足以使第一个版本比第二个版本慢,但我认为它们必须在非常小的地图上无法区分.

今天的关于如何重载 std::swap()如何重载运算符的分享已经结束,谢谢您的关注,如果想了解更多关于Android swap 分区作用及 swapper 软件设置方法、Arrays 类中的 .toString() 是如何重载的、bash:如何重定向stdin / stderr然后再恢复fd?、c – std :: map :: erase() – 哪个重载更快?的相关知识,请在本站进行查询。

本文标签: