查看: 5303| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

[学C/C++] 问一道Akuna OA题的考点

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
题意就是C++实现一个copy assignment operator 交换两个vector,
但是vector.swap(vector)在library里是已经实现了的,就没明白这道题的考点在哪?
题目在https://drive.google.com/file/d/ ... JqajRfTk9EV0xR/view
感谢@ACEgolden提供。
谢谢!

评分

参与人数 2大米 +11 收起 理由
johnsoncheng + 1 给你点个赞!
kyro + 10 很有用的信息!

查看全部评分


上一篇:一些Python高阶模板
下一篇:大神们帮忙分析下代码哪里有问题Leetcode 46 题 Javascript
magicsets 2018-11-8 15:19:37 | 只看该作者
全局:
这个题目信息不全,里面说的"Locked code stub in the editor"的内容——也就是题目所给的class Contest代码并没有贴出来。

如果是要Contest类上做修改的话,考点有可能是Rvalue reference + move assignment operator + move semantics,但是又和题目标题写的"copy assignment operator"不一致..

首先c++11是支持vector的swap的,但底层的实现并不是
--
std::vector<int> tmp = a;
a = b;
b = tmp;
--
这样,而是:
--
std::vector<int> tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
--
区别在于前者拷贝了数组的数据,而后者并没有。或者说如果数组的长度有1 billion的话,那么第一段代码执行起来会花费数秒,而第二段代码只有几个CPU cycle。

然后现在如果要让Contest支持高效的swap,那么就要forward vector的move constructor/assignment到Contest类里,也就是说要写这么一段:
----
class Contest {
public:
  Contest(Contest &&other)
      : data(std::move(other.data)) {}

  Contest& operation=(Contest &&other) {
    data = std::move(other.data);
    return *this;
  }

private:
  std::vector<int> data;
};
----

那么现在有两个Contest对象first_contest和second_contest的话,我们可以写如下的交换代码:
----
Contest tmp = std::move(first_contest);
first_contest = std::move(second_contest);
second_contest = std::move(tmp);
----

评分

参与人数 1大米 +10 收起 理由
14417335 + 10

查看全部评分

回复

使用道具 举报

全局:
swap没有实现 需要自己写 不写的话编译不过
回复

使用道具 举报

全局:
Birkhoff_L 发表于 2018/11/08 14:00:06
swap没有实现 需要自己写 不写的话编译不过

swap函数只有声明 没有实现 我是这个意思
回复

使用道具 举报

🔗
 楼主| sunnylfcee 2018-11-8 14:34:19 | 只看该作者
全局:
Birkhoff_L 发表于 2018-11-8 14:00
swap函数只有声明 没有实现 我是这个意思

还是没太明白。。。
那个swap里面是不能直接调用vector的swap函数的是吗?

那么一般的swap也是三行呀
Object temp = A;
A = B;
B  = temp;
他这个是需要把vector的所有member都交换的意思是吗?
谢谢!

评分

参与人数 1大米 +10 收起 理由
kyro + 10 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
我没用vector的swap,但是不实现那个类的swap的确编译不过。我实现的代码就是楼主写的三行。这题真不算难,我写oa前也没看懂这题啥意思,现场看也就花了十分钟。觉得楼主没必要特在意这题。祝楼主好运!
回复

使用道具 举报

🔗
 楼主| sunnylfcee 2018-11-8 16:39:34 来自APP | 只看该作者
全局:
magicsets 发表于 2018/11/08 15:19:37
这个题目信息不全,里面说的"Locked code stub in the editor"的内容——也就是题目所给的class Contest代码并没有贴出来。

如果是要Contest类上做修改...

非常感谢你!
因为也是第一次碰到非算法题
就怕自己想多了或者想少了

我也去看了源代码,vector.swap的实现好像是分allocator是否一致的。不过你的回答真的非常有启发性 感谢感谢

评分

参与人数 1大米 +10 收起 理由
kyro + 10 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
thegreatsky 2018-12-6 16:48:34 | 只看该作者
全局:
Birkhoff_L 发表于 2018-11-8 14:55
我没用vector的swap,但是不实现那个类的swap的确编译不过。我实现的代码就是楼主写的三行。这题真不算难, ...

能请教一下swap的实现思想吗?类的变量和操作符都是private的呀,我在写的时候没有想出来,能请教一下思路吗,谢谢!
回复

使用道具 举报

🔗
brian1868 2019-7-13 01:35:01 | 只看该作者
全局:
楼主你的OA是只有这一道题吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表