C ++

雇用 Top 3%自由C ++开发人员

Toptal.是专用C ++开发人员,工程师,程序员,编码器,架构师和顾问的市场。顶级公司和初创公司选择Toptal C ++自由职业者为他们的关键任务软件项目。

无风险审判,仅在满意时付款。

客户率 Toptal. C++ Developers4.3 / 5.0截至2021年2月27日的平均截至205份评论

通过领先的品牌和初创公司信任

聘请自由职业者C ++开发人员和工程师

Abhimanyu Veer Aditya.

自由C ++开发人员

美国Toptal. Member Since March 7, 2019

Abhimanyu是一种机器学习专家,拥有15年的经验,为企业和科学应用创造预测解决方案。他是一个跨职能的技术领导者,在建筑团队中经验丰富,与C级高管一起工作。 Abhimanyu在计算机科学和软件工程中拥有经过验证的技术背景,具有高性能计算,大数据,算法,数据库和分布式系统的专业知识。

展示更多

乔治克里斯特亚州

自由C ++开发人员

美国Toptal. Member Since July 1, 2017

乔治是一个以性能为导向的工程领导者,具有实质性的技术背景和商业熟练程度。他专注于设计和实施大规模分布式系统,重点是性能和可靠性。在他的职业生涯中,乔治始终如一地确定并管理技术和运营风险,具有强烈的复杂软件产品的最终最终所有权。

展示更多

凯莉安马丁

自由C ++开发人员

美国Toptal. Member Since May 18, 2018

Kelly拥有12年的经验,担任软件工程师,主要关注C ++,C和Java。她'除了并发系统外,还在桌面应用程序上工作,包括航空网中嵌入式系统的多线程系统,集群或网络。

展示更多

布莱恩齐默曼

自由C ++开发人员

美国Toptal. Member Since October 14, 2017

Bryan提供了专业的现代C / C ++开发面向对象,高度并发,低延迟,跨平台软件,在大数据,物理/工程模拟/建模,数据通信,机器学习,网络,服务器端以及嵌入式系统。他拥有丰富的经验,具有实时,关键的,全天候24/7,商业和国防系统。

展示更多

Darien Pardinas Diaz.

自由C ++开发人员

美国Toptal. Member Since November 19, 2017

Darien是一个具有图像处理,桌面应用程序和系统开发专业知识的完成软件工程师。他作为一名研究工程师在他的职业生涯的早期阶段,写作工具获取和处理大量的科学数据。后来,他开始在开发FDA兼容的医疗设备软件。最近,他'S一直为3D打印公司编写应用软件。

展示更多

Viktor Kirilov.

自由C ++开发人员

保加利亚Toptal. Member Since January 15, 2018

Viktor拥有四年多的奥运会和vfx行业的经验,但自2015年以来,他 'S一直主要致力于开源项目和合同工作。他'对游戏引擎的热情,高性能代码,数据导向设计,加密货币,最大限度地减少摩擦,并在软件开发过程中纳入良好的实践,如测试和使用工具。

展示更多

里卡多哥斯达黎加

自由C ++开发人员

巴西Toptal. Member Since July 3, 2018

Ricardo拥有超过十年的经验,作为专注于游戏开发,计算机图形学(渲染,计算机愿景和VR / AR),人工智能和客户/服务器系统的专业开发人员经验。他还在C#,C ++和Python中开发了各种桌面和服务器应用程序。他对研究尖端技术充满热情,创造实时,高性能软件和优化复杂系统。

展示更多

丹纳帕尔斯基

自由C ++开发人员

美国Toptal. Member Since December 20, 2015

丹是一种软件架构师和技术专业专业专注于区块链技术的应用。他拥有多年的经验,为客户提供专业的咨询服务,从初创公司到全球公司。他专门为艰难的工程挑战带来严格的测试和防弹码。他在人工智能,区块链,机器学习和自动化的许多方面都有深刻的专业知识。

展示更多

迈克胡顿

自由C ++开发人员

美国Toptal. Member Since June 5, 2014

Mike是一个软件架构师和开发人员,拥有超过25年的经验,开发大型任务关键系统。他目前专注于Java / J2EE开发,C ++ / C开发和IOT的嵌入式系统。他是彩票游戏系统领域的国际公认专家。他在过去的16年里一直在提供雇用地理上多样的团队的解决方案。

展示更多

立即注册以查看更多档案。

开始招聘

招聘指南

聘请伟大的C ++开发人员指南

C ++是一种强大的通用多范式编程语言。语言'S巨大的功能,其整体复杂性,缺乏优雅的外部工具,其他流行语言具有,并且获得低级资源使这是掌握最困难的编程语言之一。驯服这种猛犸象需要多大的经验和智慧。

阅读招聘指南

C ++招聘资源

更多资源来雇用C ++开发人员

职位描述模板

面试问题

常见的错误

职位

TrustPilot.
Toptal. in the press

...允许公司快速组装具有特定项目的合适技能的团队。

尽管对编码人员的需求加速了,Toptaltal旨在自行为几乎常春藤联盟级审查。

我们的客户
构建一个全球使用的跨平台应用程序
Thierry Jakicevic.
构建一个全球使用的跨平台应用程序
1
2
3
为游戏创建一个应用程序
Conor Kenney.
为游戏创建一个应用程序
1
2
3
领导数字转型
Elmar Platzer.
领导数字转型
1
2
3
推荐书

三普国不会'T存在没有顶尖。顶部项目使我们能够用产品经理,铅开发商和高级设计师迅速发展我们的基础。在60多天内,我们从概念到阿尔法。速度,知识,专业知识和灵活性是秒数。 Toptaltal团队作为三级队员的三级队员的一部分。他们贡献并就像其他人一样贡献并获得了发展的所有权。我们将继续使用TOPTAL。作为一个启动,他们是我们的秘密武器。

布兰特利步长,首席执行官& Co-Founder

三级

我对Toptaltal的经验非常满意。我必须与我一起工作的专业人士在几个小时内与我一起。我知道在与他讨论我的项目后,他是我想要的候选人。我立即雇了他,他浪费了浪费时间来到我的项目,甚至通过添加一些优秀的设计元素来加强额外的英里,以增强我们的整体外观。

Paul Fenley,导演

k dunn.& Associates

我与令人难以置信的 - 聪明,驱动和响应性的开发人员。它曾经很难找到优质的工程师和顾问。现在它是't.

Ryan Rockefeller,CEO

辐射群

Toptal.立即了解我们的项目。我们与阿根廷的特殊自由职业者与阿根廷,从第1天沉浸在我们的行业中,与我们的团队无缝混合,理解我们的愿景,并产生了顶级缺口结果。 Toptal与卓越的开发人员和程序员相连,非常容易。

Jason Kulik,联合创始人

PROHATCH.

作为一个有限资源的小公司,我们可以'不起赚得昂贵的错误。 Toptal为我们提供了一个经验丰富的程序员,他们能够击中地面运行并立即开始贡献。这是一个伟大的经历和我们'd再次在心跳中重复。

斯图尔特Pocknee,校长

站点特定的软件解决方案

我们使用Toptal聘请开发人员,具有广泛的亚马逊网络服务体验。我们采访了四名候选人,其中一个候选人竟然有适合我们的要求。该过程快速有效。

ABNERGUZMÁNVILLA,CTO和首席科学家

照片kharma.

Sergio是一个令人敬畏的开发人员。顶级陷波,响应,并有效地完成了工作。

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink.

与马林一起工作是一种快乐。他是有能力,专业,灵活的,非常快速地了解所需的内容以及如何实现它。

和réFischer,CTO

发布

我们需要一个专家工程师,他们可以立即启动我们的项目。辛巴纳斯与他的工作超出了我们的期望。不得不采访和追逐专家开发商是一个优秀的时光,让每个人都对我们的选择感到更加舒适,以改变平台来利用更强大的语言。 Toptog易于方便地制作了该过程。 Toptal现在是我们寻找专家级别帮助的第一名。

Web开发的高级VP德里克未成年人

Networld Media Group.

Toptal.'S开发人员和建筑师都非常专业,易于使用。他们生产的解决方案相当定价和最高品质,减少了推出的时间。再次感谢,Toptal。

Jeremy Wessels,CEO

Kognosi.

我们拥有Toptal的伟大体验。他们将我们与完美的开发人员配对,为我们的应用程序并使过程非常容易。它也很容易超出初始时间范围,我们能够在我们的项目中保持相同的承包商。我们绝对推荐顶尖,用于快速和无缝地找到高质量的人才。

Ryan Morrissey,CTO

应用业务技术,LLC

I'M Toptal令人难以置信地印象深刻。我们的开发人员每天与我沟通,是一个非常强大的编码器。他'真正的专业人士,他的工作很棒。顶部5星。

Pietro Casoar,CEO

Ronin Play Pty Ltd

与Toptal一起工作是一个很好的体验。在使用它们之前,我花了很长时间采访其他自由职业者和尚未'找到我需要的东西。与Toptal一起参与后,他们在几天内与完美的开发人员匹配。开发商I.'m不仅可以提供质量代码,而且他还提出了我达到的事情的建议't thought of. It'对我来说清楚,阿拉夫里知道他在做什么。强烈推荐!

乔治城,首席执行官

Buravard,Inc。

作为顶级合格的前端开发人员,我也运营了自己的咨询练习。当客户来找我来帮助填补他们的团队上的关键角色时,Toptal是我唯一舒适的推荐的地方。 Toptal.'整个候选池是最好的。 Toptal是我的最佳价值我'在近一年的专业在线工作中发现了。

Ethan Brooks,CTO

Langlotz专利&商标作品,Inc。

在嘻嘻哈哈'早期,我们以及时的方式,我们需要一流的开发商,以实惠的价格。 Toptal送货!

Lara Aldag,CEO

h

Toptal.让候选人非常容易,让您能使他们有能使他们有能力提供。我肯定会向寻求高技能开发人员的人推荐他们的服务。

Michael Gluckman,数据经理

mxit.

Toptal.迅速匹配我们的项目与最佳开发人员的能力只是一流的。开发商已成为我们团队的一部分,我对他们中的每一个都证明了专业承诺的水平。对于那些希望远程工作的人与最好的工程师来说,看起来不仅仅是Toptaltal。

Laurent Alis,创始人

临身

Toptal.让找到合格的工程师微风。我们需要经验丰富的ASP.NET MVC架构师来指导我们的启动应用程序的开发,并在不到一周内为我们提供三位伟大的候选人。在我们选择后,工程师立即在线并击中地面运行。它比我们自己发现和兽医候选人更快和更容易。

杰夫凯利,联合创始人

协调解决方案

我们需要在Scala中的一些短期工作,Toptal在24小时内发现了我们一个伟大的开发人员。这不仅仅是通过任何其他平台都无法实现。

Franco Arda,联合创始人

whatadswork.com.

Toptal.为正在进行快速发展和规模的企业提供禁令解决方案。每个工程师我们 '通过Toptal签约已经很快集成到我们的团队中,并将其工作持有最高标准的质量,同时保持炽热的发展速度。

Greg Kimball,联合创始人

nifti.com.

如何通过Toptal雇用C ++开发人员

1

与我们的行业专家交谈

Tophteal Engineering主任将与您合作,了解您的目标,技术需求和团队动态。
2

与手工选择的人才合作

在几天内,我们'LL向您介绍您的项目的正确C ++开发人员。平均匹配时间在24小时内。
3

右边合身,保证

与您的新C ++开发人员合作进行试用期(仅在满意时支付),确保它们'在开始参与之前,右边适合。

常见问题解答

  • Toptal C ++开发人员如何不同?

    在Toptal,我们彻底屏蔽了我们的C ++开发人员,以确保我们与最高口径的人才相匹配。每年申请加入Toptal Network的100,000多人,削减少于3%。您将与工程专家(从不泛化招聘人员或人力资源代表)合作,了解您的目标,技术需求和团队动态。最终结果:来自我们网络的专家审计人才,习惯符合您的业务需求。 现在开始。

  • 我可以在不到48小时内雇用C ++开发人员通过Toptal吗?

    根据可用性以及您可以进行的快速,您可以在注册的48小时内开始使用C ++开发人员。 现在开始。

  • Toptal C ++开发人员的无风险试用期是多少?

    我们确保您和C ++开发人员之间的每次参与开始于最多两周的试用期。这意味着您有时间确认订婚将是成功的。如果您对结果完全满意,我们会为您收取时间并继续接触,只要您想要。如果你没有完全满意,你将不会收取费用。从那里,我们可以通过部分方式,或者我们可以为您提供可能更适合的另一个专家,并与我们将开始第二名,无风险的审判。 现在开始。

分享
C ++

如何聘请一个伟大的C ++开发人员

C ++是一种强大的通用编程语言,用于从后端到嵌入式开发到桌面应用程序的一切,到他们运行的非常操作系统。这是一个非常少的语言之一,以支持时间的考验,因此它应该非常受欢迎和尊重。但尽管ISO C ++标准委员会和社会使其更加编程友好的努力,但它仍然可以成为最古老的语言之一。

关于C ++的特别是什么?

A 伟大的C ++开发人员 主要是A. 伟大的软件开发人员:有一个强烈的问题解决技巧和抽象思维的人,找到合适的工具和框架的能力,以及对计算机科学的热情。

有大量的面试问题是语言独立,旨在检查候选人的工程实力;在更基本的水平上, fizzbuzz问题 在过滤一般编码能力时是着名的。但我们目前的焦点将非常特定于C ++。

如果候选人也熟悉应用程序开发 其他语言,有机会使面试过程更加丰硕。在这种情况下,这些前三项问题将启动有关不同语言,其基本结构以及从中获得的优势和缺点的哲学的有趣讨论。

Q: What is RAII and how does it relate to the fact that there is no finally keyword in C++ exception handling?

Raii代表“资源采集是初始化”,是一个C ++特定的资源管理技术。这是基于C ++具有析构函数的事实和保证在异常处理时,他们将被调用,即使在异常处理时也会被调用。

We don’t need finally to deal with our resources because we can wrap them up with RAII and be sure that the destructor will be called, thanks to 堆栈放松.

问:什么是规范正确性?它的目的是什么(价值)?

Const-correctness is the practice of specifying variables and member functions as const if they are not going to be modified or modify the state of the object, respectively. The best practice is to use const whenever possible.

const 是程序员和编译器之间的合同 - 它不能以任何方式在生成的机器代码中表现出来。它的 优雅的方式 记录代码,使其更可读,更易于出错。考虑以下代码片段:

void PaySalary(const EmployeeId employee_id)
{
    Employee& employee = company.FindEmployee(employee_id);
    const auto base_salary = employee.GetBaseSalary();
    const auto performance_rating = employee.MonthlyPerformance();
    const auto debt = company.GetDebt(employee);
    const auto total_pay = CalculateSalary(base_salary, performance_rating, debt);
    company.PaySalary(employee, total_pay);
}

在此功能中,我们获取对对象的引用并进行一些进一步的操作。人们可能想知道这个对象会发生什么 - 特别是什么时候可以修改?

这 fact that GetBaseSalaryMonthlyPerformance are const 成员 functions tells us that employee will not change its state after these calls. GetDebt takes a const Employee&, which, again, means that it hasn’t been modified. The PaySalary function, however, takes an Employee&, so that’s where we would dig in.

在设计类时,人们应该始终要注意的要注意,因为它包含将使用它的开发人员的消息。

较新的C ++标准

在过去十年中,C ++在过去的十年中提出了前所未有的发展速度。自2011年以来,我们每三年都有新标准:C ++ 11,C ++ 14,C ++ 17和C ++ 20。 C ++ 14是C ++ 11的次要更新,但其他所有其他功能都具有重要的新功能。这些功能的知识显然是必要的,但对于旧标准的替代方案来说也很重要。

尽管较新标准的绝大多数变化是添加的 - 弃权和删除是非常稀释的,但是对于新标准的码级是远离容易的。适当的开关,充分利用新功能,将需要大量的重构。

And there is still a huge amount of C++98 and C++03 code out there requiring constant care and attention. The same goes for C++11 and C++14. Besides knowing about the constexpr if (which came with C++17), a great C++ programmer should also know how to achieve the same results when stuck with an older standard.

开始讨论的有趣方法是向候选人询问他们最喜欢的特征。强大的候选人应该能够列出给定标准的最重要的功能,选择最喜欢的标准,并给出他们选择的理由。当然,没有正确或错误的答案,但它很快就揭示了候选人的语言的感受。

问:C ++ 11/14引入了几种重要特征。你发现哪个提出了最大的改进,为什么?

auto Keyword and Range-based for Loops

auto keyword frees us from having to explicitly specify the type of a variable when the compiler is able to deduce it. This results in cleaner, more readable, and more generic code. The range-based for loop is syntactic sugar for the most common use case.

// before C++11
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) {

// after C++11
for (const auto& val : vec) {

lambda的功能

这是一个新的语法,允许开发人员定义函数对象就是可以定义的。

std::count_if(vec.begin(), vec.end(), [](const int value) { return value < 10; });

移动语义

This allows us to explicitly define what it means for an object to take ownership of another object. As a result, we get to have move-only types (std::unique_ptr, std::thread), efficient shallow copy from temporaries, etc. This is a pretty big topic nicely covered by a chapter of Scott Meyers’ 有效的现代C ++:42种改善您使用C ++ 11和C ++ 14的具体方法.

智能指针

C ++11 introduced new smart pointers: unique_ptr, shared_ptr, 和 weak_ptr. unique_ptr effectively made auto_ptr obsolete.

内置支持线程

无需与OS本机和C风格的库斗争。

问:C ++ 17的哪个功能您发现最有用,为什么?

结构束缚

此功能会增加可读性。

// before C++17
for (const auto& name_and_id : name_to_id) {
    const auto& name = name_and_id.first;
    const auto& id = name_and_id.second;
 
// after C++17
for (const auto& [name, id] : name_to_id) {

编译时 if

With if constexpr, we can have different parts of code enabled depending on a compile-time condition. This makes the template metaprogramming (TMP) enable_if magic easier and nicer to achieve.

内置文件系统库

就像在C ++ 11中的线程支持一样,这种内置库继续减少对C ++开发人员的需求来编写特定操作操作系统的代码。它提供了一个与文件一起使用的界面(不是他们的内容)和目录,让开发人员复制它们,删除它们,递归地迭代它们,等等。

并行STL.

C ++ 17-C ++ 17的并行替代方案包括C ++ 17 - 由于即使在桌面上也变得普通的多核处理器已成为普通的重要特征。

问:您认为C ++ 20的哪个功能是一个很好的补充,为什么?

开发人员至少有两个有希望的C ++ 20个功能。

约束和概念

此功能提供了丰富的新语法,使TMP更具结构化,其构造可重用。如果正确使用,它可以使代码更可读,更好地记录。

范围

C ++程序员背后 范围-V3库 主张纳入C ++ 20。使用UNIX管道语法,可组合结构,懒人范围组合器等功能,该库旨在为C ++提供现代功能的外观。

std::vector<int> numbers = …;
for (auto number : numbers
                | std::views::transform(abs)
                | std::views::filter(is_prime)) {
    …
}
 
// the alternative without ranges
for (auto orig_number : numbers) {
    auto number = abs(orig_number);
    if (!is_prime(number)) {
        continue;
    }
    …
}

In the example above, the transformfilter operations are performed on the run, without affecting the content of the original container.


最初,C ++的创建者Bjarne Stroustrup已将其命名为“C的类”,具有支持面向对象编程的动机(OOP)。对OOP概念和设计模式的一般性了解在语言之外,因此检查C ++程序员的OOP知识不需要以C ++在大多数情况下具体。但是,有一些小特异性。一个非常常见的面试问题是:

问:动态多态性(虚拟功能)如何在C ++中工作?

在C ++中,通过虚拟功能实现动态多态性。

班级 Musician
{
public:
    virtual void Play() = 0;
};

class Pianist : public Musician
{
public:
    virtual void Play() override {
        // piano-playing logic
    }
};

class Guitarist : public Musician
{
public:
    void Play() override {
        // guitar-playing logic
    }
};

void AskToPlay(Musician* musician)
{
    musician->Play();
}

多态性(来自希腊人 poly,意思是“很多”和 变形, meaning “shape”) here is that AskToPlay behaves in different ways depending on the type of the object musician points to (it can be either a Pianist 或者 a Guitarist). The problem is that C++ code has to compile into a machine code that has a fixed set of instructions for each, including and especially the AskToPlay function. Those instructions have to choose where to jump (call) at run-time, to Pianist::Play 或者 Guitarist::Play.

编译器最常见​​和有效的方法是使用 虚拟表 (或者 vtables.). A virtual table is an array of addresses to virtual functions. Each class has its own vtable, and each instance of that class has a pointer to it. In our example, the call to Play actually becomes a call to a function that resides at the address written in the first entry of the vtable that *musician points to. If it had been instantiated as a Pianist, its pointer to vtable would have been set to Pianist’s vtable, and we’d end up calling the right function.


另一种特异性来自C ++支持多重继承的事实,并且没有任何形式的区别 界面 A. 班级。经典问题 钻石问题 是一个很好的初学者讨论这一点。

作为多偏见量程编程语言,C ++还支持功能性编程(FP),在C ++ 20标准中引入范围后,这已成为更大的交易。它从功能代码的表达性和可读性的角度来看,它将C ++更接近于其他,更加FP友好的(或FPED)语言。初学者的一个例子是:

问:Lambda如何工作?

这 compiler generates a functor class with an operator() with the body of the lambda, and with members to store the copies of or references to the captured variables of the lambda. Here’s an 例子.

与其他问题相同 虚拟功能:候选人看过罩下面,并确切知道它是如何工作的,否则这是一个很好的地方,即开始一般讨论的一般性问题 他们主要在哪里派上用场?什么是c ++编程,如在lambda函数之前?.


Template meta-programming is yet another paradigm supported by C++. It encompasses a number of useful features, which have been accompanied by better alternatives introduced in newer standards. New features like constexprconcepts make TMP less puzzling, but then again, there is still a lot of production code with puzzles. A famous TMP puzzle question is:

问:如何在编译时计算_n_th fibonacci号码?

With the newer standards, it’s as trivial as having a constexpr specifier in the beginning of the recursive implementation.

constexpr int fibo(int n)
{
    if (n <= 1) {
        return n;
    }
    return fibo(n - 1) + fibo(n - 2);
}

没有那个,它将是:

template <int N>
struct Fibo
{
    static const int value = Fibo<N - 1>::value + Fibo<N - 2>::value;
};

template <>
struct Fibo<1>
{
    static const int value = 1;
};

template <>
struct Fibo<0>
{
    static const int value = 0;
};

STL,数据结构和算法

标准模板库(STL)是内置于C ++中的库。它已经使用了C ++,这很长时间,很难将其从核心语言中分离。 STL带来C ++开发人员四种功能:

  • Containers—implementations of some fundamental data structures, like vector, list, map, 和 unordered_map
  • 算法—implementations of some fundamental algorithms, like sort, binary_search, transform, 和 partition
  • 迭代器 - 用于与算法一起使用的容器的抽象
  • 函授 - 一种自定义算法的方法

STL的设计和哲学是独特的,非常广泛。任何体面的C ++程序员都必须具有强烈的STL知识,但问题是在哪个程度上?第一级是所谓的 用户级别 知识。那是候选人至少知道最受欢迎的容器和算法,如何以及何时使用它们。接下来的三个是一些经典的问题来检查这一点:

Q: What are the differences between listvector? How should C++ developers choose among them?

Both listvector are sequential containers but based on different data structures. list is based on a doubly linked list, whereas vector contains a raw array.

这 advantages are split between them. vector has the advantages of storing the data consecutively, with no memory overhead and constant-time indexed access. In contrast, list has constant-time insertion and removal at any position, and supports features like splice, merge, 和 in-place sortreverse.

As a result, vector is more popular and most of the time is the right choice. list will be the better choice in some corner cases, like when dealing with heavy-to-copy objects, so that developers can keep them in order, or move from one container to another by just manipulating their node connections.

Q: How can you remove all _42_s from a vector? What about a list?

这 trivial approach would be to iterate over the container and erase each occurrence with the erase 成员 function, which both containers have. This is perfectly valid in the case of a list; in fact, its remove 成员 function does pretty much the same.

But there’s a reason why vector doesn’t have such a 成员 function. This approach is quite inefficient because of vector’s underlying data structure. The elements of vector are consecutive in the memory, so erasing an element means shifting 全部 后续元素返回一个位置。这将导致很多额外的复制。

最好的方法是 擦除 - 删除 idiom:

vec.erase(std::remove(vec.begin(), vec.end(), 42), vec.end());
// initially        - { 1, 2, 42, 3, 4, 42, 5, 6 }
// after the remove - { 1, 2, 3, 4, 5, 6, ?, ?, }
// after the erase  - { 1, 2, 3, 4, 5, 6 }

First, we apply remove on the whole range, which doesn’t remove 42s from it—it just moves the others to the beginning, and it does that in the most efficient way. Instead of moving 6 to the left twice by one position (which would happen if we individually erased 42s), it only moves 6 once, by two positions. With erase then, we erase the “waste” at the end.

这个成语很好地涵盖了斯科特迈耶的传奇第32项 有效的STL:50种具体方法来改善您对标准模板库的使用.

Q: What are the different types of iterators in C++? Which ones work with std::sort?

有六个类别的STL迭代器: 输入, 输出, 向前, 双向, 随机访问, 和 连续.

这 category of an iterator denotes its functionality, and those categories are inclusive. This means, saying ‘the iterator of set is 双向’ effectively means it’s also 向前 but neither 随机访问 也不 连续.

STL迭代器类别的Venn图,具有每个属性和示例。

Differences of the categories are due to the data structures of the containers. A vector iterator is a 随机访问 one, which means, unlike a set iterator, it can jump to any point in constant time. std::sort requires its parameters to be 随机访问 iterators.


这些可以说是STL最受欢迎的部分,因此任何具有至少一年经验的C ++程序员都会满足并与他们合作。但那还不够。高质量的C ++开发人员不仅要知道所有STL容器以及如何使用它们,还要知道它们背后的抽象数据结构,每种抽象数据结构,每个优点和缺点。

此外,他们不仅应该知道大部分算法还是它们 渐近复杂性。这意味着C ++开发人员应该在大O条款中理解标准算法的性能和他们使用的数据结构,以及两者背后的理论。问题可能非常具体:

STL容器基础知识

而不是彻底地测试这些知识,审计风格选择一些事实 - 如果需要 - 应该使其清除候选人在这些普遍需要的细节中是足够的。

  • How is [a given container, e.g., vector] implemented?
  • 其中类是[给定容器]的迭代器?
  • What’s the asymptotic complexity of [a given operation, e.g., remove] on [a given container]?

vector 将元素存储在底层数组中,具有大小标记。完整时,分配新的更大的存储空间,该元素从旧存储复制,然后释放。它的迭代器是 随机访问 category. The asymptotic complexity of insert (push_back) is 摊销不断的时间,索引访问是 不断的时间,删除是 线性.

list 实现双链接列表,将指针存储到头部和尾部节点。它的迭代器是 双向. The complexity of insert (push_backpush_front) and remove (pop_backpop_front) are 不断的时间,而索引访问是 线性.

setmap are implemented on a balanced binary search tree, more specifically a red-black tree, thus keeping the elements sorted. Their iterators are 双向 也是。插入,查找(查找)和删除的复杂性是 对数. Removing an element with an iterator (erase 成员 function) has 摊销不断的时间 complexity.

unordered_setunordered_map are the implementations of the hash table data structure. Usually, it’s an array of so-called buckets, which are simply linked lists. A bucket is chosen for an element (during the insert or lookup) depending on its hash value and the total number of buckets. When there are so many elements in the container that the average bucket size is greater than an implementation-defined threshold (usually 1.0), the number of buckets is increased and the elements are moved to the right buckets. This process is called 重新努力,它使插入的复杂性 摊销不断的时间。查找并删除有 不断的时间 complexities.

这些是最基本的容器 - 上述细节的知识几乎是必不可少的,但是是否测试了每个最后的细节都是为了取决于面试官的直觉。

问:[给定算法]的渐近复杂性是什么?

一些着名的STL算法的渐近复杂性是:

算法 复杂
std::sort o(n log(n))
std::nth_element 在)
std::advance o(1) 随机访问迭代器,否则o(n)
std::binary_search o(日志(n)) 随机访问迭代器,否则o(n)
std::set_intersection 在)

或者,一个问题要涵盖它的问题:

问:哪个容器可以 插入 操作无效迭代器?

这个问题的优雅是难以记住,正确的答案需要大量了解包含一些逻辑的容器的底层数据结构。

插入 operation might invalidate the iterators on vector, string, deque, 和 unordered_set/map (in case of expanding/rehashing). For list, set, 和 map, this is not the case thanks to their node-based data structures.


它在许多开发人员面试中提供了标准,以提供计算问题,并期望候选人开发一种算法来解决它。有一堆具有竞争性C ++编程的巨大平台,如Leetcode,Hackerrank等。充满了这样的问题。

这些问题是有价值的,因为他们立刻检查了很多东西。大多数面试官将从故意发出的问题陈述开始,以测试候选人的问题解决技巧和提出正确问题的能力。然后,候选人必须解决问题,写代码,并最重要的是,做复杂性分析。

擅长后者,并且在使用STL集装箱和算法以及写新的算法时,具有强烈的数据结构知识就足以做出明智的决策。有些人可能会进一步走得更远,看看实际实现。每个人都在某些时候在某些时候在STL代码中,或者在调试时,或者愿意。如果候选人去了那里并设法理解这种痛苦,那些关于他们的经历,好奇心和持久性的措施。例如:

Q: Which sorting algorithm does std::sort implement?

ISO C ++标准未指定算法;它只设定了渐近复杂性的要求。然后选择取决于实现(即,Microsoft Vs. GNU的实现)

其中大多数不仅仅是用单个算法定居 合并 或者 Quicksort.。常见方法是具有那些混合或根据尺寸选择一个。例如,GCC实现 内部,这是一个混合 Quicksort.hea。当长度小于实现定义的阈值时,它从第一个启动并切换到大量。

C ++:时间测试,但开发团队必须擅长避免其陷阱

本指南中概述的问题涵盖了C ++编程的一些基本和一些棘手的方面。但就像它的可能性一样,语言隐藏的惊喜是无限的,这使得很难在采访中涵盖关于C ++的一切。因此,通过能够清晰生动地传达思想的能力,评估候选人的能力,技能集和对C ++的深刻理解。

我们希望这些问题能够帮助您作为在全职或兼职角色中搜索真正的高质量C ++专家的指导。这些稀有的精英可能很难通过,但它们会从您的C ++编程团队中清楚地脱颖而出。

特色TOPTAL C ++出版物

顶级C ++开发人员需求量很高。

开始招聘