精华内容
下载资源
问答
  • STL欠缺什么?

    万次阅读 多人点赞 2011-08-01 11:57:07
    既然要说STL欠缺什么,那么我们就先来看看STL都能干什么,有什么优势。 首先,STL封装了常用数据结构,避免了程序员重复发明相同功能的轮子(其实很多语言都直接提供对基本数据结构的支持,例如Java)。 其次...

    写这种文章估计又要被一些"砖家"拍砖了,但是今天突然想反思一下这段时间剖析的STL源码,于是就有了本文.纯属个人观点,希望"砖家"们手下留情。

    什么是STL(这里)?

    STL = Standard Template Library,标准模板库,是现代C++程序设计的重要组成部分,同时也是C++标准的一部分,对应编程范式的generic programming(泛型编程)。其核心思想是数据与算法的分离,这就催生了algorithm(算法)和container(容器),而将二者联系在一起的工具就是充当粘合剂的iterator(迭代器),这验证了计算机世界中的一句名言“任何问题都可以通过增加一个间接层来解决”:-)。

    STL的组建都是高度可复用的,也是高度可配置、可扩充的,我们完全可以根据需要进行相应的优化。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。其中由于历史原因,非常重要的数据结构hash_table没有被加入进去,这不得不能说是一种遗憾,不过Boost库解决了这个问题(BTW,Boost库中的每一项特性都可以看作是对C++语言缺陷的一种弥补:P),其实在常见的STL实现中,比如我正在剖析的SGI STL(这里)就提供了<hash_table>的实现,另外还有<slist>、<hash_map>、<hash_set>等非标准容器。

    STL优点

    既然要说STL欠缺什么,那么我们就先来看看STL都能干什么,有什么优势。

    首先,STL封装了常用数据结构,避免了程序员重复发明相同功能的轮子(其实很多语言都直接提供对基本数据结构的支持,例如Java)。

    其次,STL是高度可配置、可复用、可扩展的一系列组件,其算法效率非常高,很大程度上是等价甚至超越大部分程序员手写的代码(大家看看SGI STL的<stl_alloc.h>,其内存池设计的极其巧妙,堪称艺术品)。

    再次,STL提供了优秀的可移植能力,在不同平台上都可以使用。

    最后,STL能极大程度上提升程序员的编程效率。

    下面给出一个非常简单的例子,让大家体验一下STL的强大:

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    
    using namespace std;
    
    int main()
    {
        vector<int>      vec;
        int              input = 0;
    
        // 这里使用cin,eof作结束, 按键视具提平台
        // Windows --> Ctrl + Z
        // Linux   --> Ctrl + D
        while (cin >> input)
        {
            // 这里可以动态调整容器大小, 体现了STL的灵活
            vec.push_back(input);
        }
    
        // STL默认排序使用的是升序排列
        sort(vec.begin(), vec.end());
    
        // 输出所有元素, 并用空格分隔
        copy(vec.begin(), vec.end(),
             ostream_iterator<int>(cout, " "));
    
        return 0;
    }
    

    想一想,上面的这个程序你要是完全手写要多长时间?要调试多久?我只用了五分钟就完成了这个STL版本的程序,是不是很强大?

    STL不足

    既然写了一个具体例子,那么我们就说说上面例子的缺点:

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    
    using namespace std;
    
    int main()
    {
        // 这里使用的是vector的默认构造函数, 根据实现的不同, 可能会预留内存空间,
        // 也可能不预留, 比如我剖析的SGI STL就不会预留内存
        vector<int>      vec;
        int              input = 0;
    
        while (cin >> input)
        {
            // 如果数据量很大的时候, 会导致频繁分配内存, 这带来的开销非常大
            // 解决方案是调用reserve()进行内存的预留, 但是这对程序员的要求
            // 比较高, 要求其对STL比较熟悉, 才能避开一些晦涩的问题
            vec.push_back(input);
        }
    
        // STL默认排序使用的是升序排列
        sort(vec.begin(), vec.end());
    
        // 这里如果使用wcout就会造成不兼容的情况, 解决方案见后续文章
        copy(vec.begin(), vec.end(),
             ostream_iterator<int>(wcout, L" "));
    
        return 0;
    }
    
    看看上面这段程序在Fedora 15 + CodeBlocks + G++环境下给出的错误:

    /home/mdl/SourceCode/BoostTest/main.cpp|29|错误:对‘std::ostream_iterator<int>::ostream_iterator(std::wostream&, const wchar_t [2])’的调用没有匹配的函数|
    /home/mdl/SourceCode/BoostTest/main.cpp|29|附注:备选是:|
    /usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stream_iterator.h|187|附注:std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_iterator(const std::ostream_iterator<_Tp, _CharT, _Traits>&) [with _Tp = int, _CharT = char, _Traits = std::char_traits<char>, std::ostream_iterator<_Tp, _CharT, _Traits> = std::ostream_iterator<int>]|
    /usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stream_iterator.h|187|附注: 备选需要 1 实参,但提供了 2 个|
    /usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stream_iterator.h|183|附注:std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_iterator(std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_type&, const _CharT*) [with _Tp = int, _CharT = char, _Traits = std::char_traits<char>, std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_type = std::basic_ostream<char>]|
    /usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stream_iterator.h|183|附注:  no known conversion for argument 1 from ‘std::wostream’ to ‘std::ostream_iterator<int>::ostream_type&’|
    /usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stream_iterator.h|171|附注:std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_iterator(std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_type&) [with _Tp = int, _CharT = char, _Traits = std::char_traits<char>, std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_type = std::basic_ostream<char>]|
    /usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stream_iterator.h|171|附注: 备选需要 1 实参,但提供了 2 个|
    ||=== Build finished: 8 errors, 0 warnings ===|
    不知道面对这样一堆提示你做何感想,这是STL暴露出来的第一个缺点,一旦出错,其提示信息会非常晦涩难懂。

    当然这仅仅是STL在表面上能看到的不足,那么其在更深层次有什么不足呢?

    首先,STL在设计的时候并没有考虑到线程安全,他们认为这是程序员的责任。好吧。。。我承认,但是试问有多少人能处理好这个问题?为什么在语言层次不提供支持?不过好消息是C++0已经能在语言层次支持线程同步了。同样是在我剖析的SGI STL<stl_alloc.h>中,其对线程安全支持也仅仅是allocator层次的,算法和容器并不能享受这样的待遇。

    其次,STL的教学一直得不到应有的重视,试问有多少大学在教授C++的时候教授STL?

    再次,如果对STL了解不足,那么可能带来非常低的效率。见下面代码:

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    
    using namespace std;
    
    class ExpensiveCopyObject
    {
    public:
        ExpensiveCopyObject(string hugeData =
            string("This is a very long string...............................")) :
            hugeData_(hugeData)
        {
            cout << "Construct" << endl;
        }
    
        ~ExpensiveCopyObject()
        {
            cout << "Destruct" << endl;
        }
    
        ExpensiveCopyObject(const ExpensiveCopyObject &other) :
            hugeData_(other.hugeData_)
        {
            cout << "Copy" << endl;
        }
    
    
        ExpensiveCopyObject &operator =(ExpensiveCopyObject &rhs)
        {
            cout << "ioperator =()" << endl;
    
            this->hugeData_ = rhs.hugeData_;
    
            return *this;
        }
    
        // ......
    
    private:
        string  hugeData_;
    };
    
    using namespace std;
    
    int main()
    {
        // 想想一下这个vector要是内存重新非陪开销有多大?
        // 比较好的作法是在vector存储指针, 但是这需要程序员自己控制指针生命周期
        // 这样做很容易导致野指针问题, 所以不推荐
        // 最好的解决方案是使用::boost::shared_ptr
        // 具体详情见后续文章
        vector<ExpensiveCopyObject>     vec(10);
    
        // ........
    
        return 0;
    }
    


    最后,STL的学习曲线比较陡峭,其设计理念也需要长时间在实践中反思才能领悟,本来C++语法已经让很多人头疼不已,更不用说那些虚函数表一类的东西了,至于调试模板时的一次次打击,让很多人选择了离开,转向了Java、C#等更简单的语言。即使坚持了过来,又有多少人肯花时间在STL源码中探寻宝藏?这都成了STL发展的阻碍。

    一些建议及设想

    首先,不奢求C++能为我们提供Socket,数据库这些封装好的类库,我只求C++能为我们提供一个稳定的程序库,提供常用的功能,像boost中的那些库真的应该多加入几个到标准中,这样能极大程度上减轻程序员的负担。也许你说用第三方库也能达到目的,但是如果C++标准规定了,那么我们就能有一个稳定的接口,而且不用为了众多功能相似的库而苦恼。

    其次,既然C++0x在语言层次支持了线程同步,那么STL和Boost库没有理由不提供线程安全了吧?!这个是我最期待的特性!

    再次,就是争议很大的垃圾回收机制,这个我觉得真的有必要加入进去,想一想在WIndows下如果你自绘界面的话,即使使用shared_ptr、scoped_ptr再配合weak_ptr,那还是肯能导致内存泄漏,所以我希望能加入一个选择性托管的特性。

    还有在大部分STL的实现中assert的支持不足,很多时候不知道问题出现在哪,要是多一些assert进行校验,那么会给调试带来很大的方便。

    最后这个可能在我有生之年也看不到了,就是把C++中那些有历史问题的函数命名更改成更容易让人理解的,唉。。。

    写在最后

    以上观点纯属个人理解,请“砖家”和“叫兽”手下留情,如果我真的哪里理解有误,欢迎批评指教。

    勘误

    关于STL线程安全的问题和大家讨论的最多,我经过实际测试也证实了提供线程安全的非必要性与困难性。

    如果我们要提供线程安全,首先考虑容器的安全性,我们对容器的写入和读取都进行Lock,那么这能满足我单次访问的安全性,但是业务逻辑的安全还是需要自己进行Lock,所以这个层面的Lock属于多余的操作,没有用处,且会带来不必要的负担。下面用一段代码说明此种情形:

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    const int vecCapacity = 100;
    
    int main()
    {
        typedef vector<int> IntVec;
    
        IntVec vec(vecCapacity);
    
        // 假设vec[]操作是线程安全的, 那么我们能保证如果程序流程在[2]时线程安全吗?
        // 答案是不能, 因为后面还跟着一个赋值操作, 程序可能在这里切换线程,
        // 如果另外线程对vec进行了一些操作, 其结果肯定不是我们预期的
        // 同样, 程序在[1]进行切换的时候, 假设另外的线程修改了vec[i - 1],
        // 那么结果必然不是我们的预期行为
        // 这只是一个vector<int>就带来了这么多问题, 如果里面不是int而是一些需要
        // 进行处理才能使用的对象, 其产生的后果不勘设想
        for (int i = 0; i < vecCapacity; ++i)     // [1]
            vec[i] = i;                           // [2]
    
        // 这段代码的问题除了上面提到的, 还有几个细节需要注意
        // 如果在[3]或者[4]处切换线程, 如果其它线程对vec进行了操作, 导致迭代器失效,
        // 那么我们就可能得到错误的结果, 不但是容器内容的错误, 还很可能是业务逻辑错误
        for (IntVec::const_iterator iter = vec.begin();         // [3]
              vec.end() != iter; ++iter)
            cout << *iter << endl;                              // [4]
    
        return 0;
    }
    
    至于对算法进行Lock,和上面的情形类似,都只能保证单次的正确性,不能保证整体上的正确性。
    还有一种想法是对迭代器进行Lock,这种方案只能解决一小部分问题,如果涉及到将迭代器传入到其它函数时,问题复杂性呈指数级增长,所以此方案也不现实。

    所以,给STL提供线程安全不但增加了STL实现的复杂性,也造成了高昂的负担,但是我们期待的线程安全还没实现,所以STL不提供线程安全才是正确的选择。

    对于先前的错误假设,我向大家表示抱歉,特此感谢给我指出错误的各位兄弟。

    展开全文
  • 最近在研究某一博主的代码时偶然发现了一个问题,第一反应肯定是我自己知识上的欠缺。然后经过各种百度啊之类的终于找到了原因。
    最近在研究某一博主的代码时偶然发现了一个问题,第一反应肯定是我自己知识上的欠缺。然后经过各种百度啊之类的终于找到了原因。



    上面就是我遇到的问题,按照我的理解,featLabel这个列表经过函数调用后值应该还是空的,如果普通的参数,我的这种理解是完全正确的,但是为什么列表featLabel会跟着改变呢?于是我联想到了java里面的像String这种引用数据类型,貌似他们有几分相似之处。好了,问题说到这,接下来说一下问题的解决。
    在python中的数据可以分为可变数据类型和不变数据类型。
    可变数据类型:
    像list,dict之类的变量就是可变数据类型,变量名存储的是一个地址,该地址指向一个具体的对象,并且不管对变量的值即对象做怎么样的操作,都不会改变变量名存储的地址。下面是一个例子:

    def fun(labels):
        dic = [1, 2, 3]
        labels.append(dic)
        print(id(labels))
        return dic

    if __name__ == '__main__':
        labels = ['hello']
        my = fun(labels)
        print(labels, '\n', id(labels))
    结果如下:


    ['hello', [1, 2, 3]] 
     39593224
    可见,我们把列表作为参数传入一个函数时,在函数内我们对该列表进行了一些改变,由于变量存储的地址没有变(在函数内部和函数外部都是39593224,所以就算我们没有故意通过return语句把该列表传递出来,该列表还是会在函数执行结束后跟着改变的。

    不变数据类型:
    不变数据类型的对象一旦发生改变,就会在内存中开辟一个新的空间用于存储新的对象,原来的变量名就会指向一个新的地址。举个例子:
    def fun(labels):
        labels = 'world'
        print(id(labels))

    if __name__ == '__main__':
        labels = 'hello'
        fun(labels)
        print(labels, '\n', id(labels))
    结果如下:
    38578360
    hello 
     39220984




    展开全文
  • 爱你,欠缺什么?

    千次阅读 2007-01-09 21:16:00
    nbsp;19:22 2007-1-9下班了,她走了,没有和我打声招呼,心又开始虚起来了...笑渐闻声渐悄,多情却被无情恼她不算是无情我也不是多情,但不得承认我确实有些“愁恼”。今天我看到她生气的样子了,在她狠狠一甩的那

    nbsp;

    19:22 2007-1-9
    下班了,她走了,没有和我打声招呼,心又开始虚起来了。忽然想起了苏东坡的词:

    蝶恋花·苏东坡

    花褪残红青杏小。燕子飞时,绿水人家绕。枝上柳绵吹又少,天涯何处无芳草!
    墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄,多情却被无情恼

    她不算是无情我也不是多情,但不得不承认我确实有些“愁恼”。

    今天我看到她生气的样子了,在她狠狠一甩的那一刻我终于明白了。她的心理没有什么奇怪的地方,也不是情敌问题,是她内心深处的害怕,害怕我们最终还是会分开。我打败了情敌却最后输给了生活的未知数。我再有心,再有活力,再有才气都没有用,因为明天始终是不可预知的,我要问了,爱你,我还欠缺了什么?
        没有错,我的生活的确有少许变化,在能力方面也比以前强了不少,可是现在面对这个矛盾显然显得无能为力。没想到2007年一开始这个感情挑战竟然让我“单膝下跪”,我会站起来吗?我对自己说,会的!
        微蓝,这几天给你添烦心了,我也不想。生活的确充满了矛盾,但这些矛盾却有主次之分,与你的过去相比,我们合不合适在一起是主要矛盾,所我不在乎你的过去;与两人在一起有没有结果相比,爱的过程是主要矛盾,所以我不太在乎结果;与你爱不爱我相比,成长是主要矛盾,所以我还是不太在乎你爱不爱我。微蓝,我猜你不在乎我的过去,但还是有点在乎我们的结果,我只希望你给自己一些时间想想值不值得爱我!

    展开全文
  • 很多欠缺这方面专业知识的人,都认为其开发是高深莫测,非一般人所能尝试。今天摩天游科技小编凭借十年开发经验,给大家说说棋牌游戏开发所需要的技术支持有哪些,想要了解一二的朋友可以看一下。 1、开发语言 ...

    随着近几年棋牌游戏大火,棋牌游戏开发技术也在与时俱进,逐步成熟。很多欠缺这方面专业知识的人,都认为其开发是高深莫测,非一般人所能尝试。今天摩天游科技小编凭借十年开发经验,给大家说说棋牌游戏开发所需要的技术支持有哪些,想要了解一二的朋友可以看一下。

    1、开发语言

    开发一款简单的棋牌游戏,需要用到最基本的预言师Java和XML,现在很多公司也在用C++语言实现。另外对于游戏动效、界面编写,现在比较常用的是cocos2D和unity3D技术。无论是哪一种技术语言,都需要有经验的工程师来做,经常会有人问小编,如果是在大学学过编程语言,可以独立开发一款棋牌游戏吗,据小编了解,那是有点困难的。但是已经比入门级程序员厉害多了,所以广大刚毕业的程序员们,要继续加油了。

    2、手机棋牌游戏开发语言

    现在手机系统主要是安卓和iOS,开发安卓系统时,常用的是Java语言,苹果机系统的话,Objective-C语言、xcode开发环境等,都是必须的,加上全方位的各型号手机测试,定期沟通游戏需求,这些都会帮你做好手机上的棋牌游戏开发工作。

    3、软件开发能力

    为什么建议大家一定要找专业的棋牌游戏开发公司来做呢,主要是他们具备一定的软件开发能力,有很多开发技能做支撑,100-200人的成熟团队,足够给你开发一款精美的游戏。另外,成熟的开发能力,还可以理解为像是一个界面的开发、数据库开发、通讯接口开发、协同开发与联调等,再加上游戏本身的玩法规则、故事线、建模等环节,每一处都是非常细致的。

    4、良好用户体验

    无论是在哪里做开发,用什么语言开发,棋牌游戏开发最重要的就是关注用户体验,站在玩家角度出发。那么如何才能做到这点呢,那就是一定要在游戏开始之前,做好市场调研、用户调研,了解你的用户想要什么,不想要什么,为以后的游戏框架树立建立一个指导,这是非常重要的,希望引起大家注意。

    通过上文,大家应该对棋牌游戏开发所需要的技术支持,有一定了解了,当然小编描述的还是不全面的,像是一些玩法设立、界面设计、软件测试等诸多环节,还没有提到,需要我们自己去探索。希望大家读罢此文,能够对棋牌开发有一定了解,从这些技术层面去考察开发商,也是一个明智的举动。

    展开全文
  • 少年易学老难成,一寸光阴不可轻!

    千次阅读 2018-11-29 14:40:17
    目前是大二,感觉自己的技术欠缺的比较多,以前敲代码比较少,就是一些简单的习题,所以感觉技术还是不行,现在给自己制动一个计划,以后学习的收获也会及时的来分享. 计科萌新成长之路 第一步:制定计划 1.希望通过...
  • 阿里妹导读:本文是一个理论过度到实践的典型案例,...知识内容有点乱,感觉都认识,又都模模糊糊,更谈上将内容转化成生产力或是用来解决实际问题了。这是因为知识没有贯通、没有实践、没有组织。   上图...
  • 我认为对于美的特殊追求和执念是前端程序员成为优秀路上必不可少的一个能力,而且这项能力必须在做前端程序员的那一刻就得有意识且慢慢养成习惯才行。 其实,我发现很多前端程序员还是缺乏这项能力的。 你们认为呢...
  • 但AI+教育的落地也只是刚刚开始不久,业界一致认为AI在教育领域的应用尚处在早期阶段,依然面临缺少足够数据、经验案例欠缺、伦理安全风险、传统教育惯性等等挑战。 正如与会嘉宾所言,宏观层面,国家认识到人工智能...
  • 2月29日消息,金山副总裁、网游事业部总经理邹涛今日向网易科技表示,自金山于07年10月赴香港上市后,运营网游将不再受资金困扰,目前只是欠缺一个好的发展时机。"邹涛表示,上市后,金山在网游领域的运营已不再受到...
  • 客户支持欠缺提供教程视频,实时聊天,电话,论坛甚至常见问题解答部分也没有。 8. Justinmind Justinmind是一款用于Web和移动应用原型以及高保真网站线框的UX工具。它既可以做低保真的线框图,也可以做高保真...
  • 青年人职场生存七大勇气不可缺少

    千次阅读 2004-11-10 10:00:00
     最近有一本书在中国相当流行,那就是《从A到A+》,这本书有一个重点,说的是卓越的领导很多都是通过后天的努力成功的,而他们追求卓越的过程,即使不是领导者的人也都参考。  一个人会成为卓越的领导人,...
  • 思科的网络安全技术

    千次阅读 2012-07-13 13:32:50
    ---- 网络的稳定和速率是满足客户需求,保证客户利益、赢得客户满意,从而提高互连网公司竞争力的关键所在,因此网络安全是不可欠缺的重要考虑因素。应用的安全性同样可体现在应用的多个方面,包括机房安全、服务器...
  • 1 GridView长按支持拖动排序,... 4 拖动的Item和被拖动的Item左标完全重合后新建文件夹 5 长按Item 出现删除按钮,此时点击删除按钮可以任意删除某一item 6 GridView横竖屏排列列数改变,横屏的行数是竖屏幕的列数
  • 后来,又有读者私信问我,“挺纠结的,知道该选前端还是 Java?” 真不好选,因为“男怕入错行,女怕嫁错郎”,初学者纠结这个问题也是情有可原。 首先来说说 PHP,Web 蛮荒的年代,PHP 真的是王者姿态,连 Java ...
  • 使用matlab设计编辑的下拉框

    千次阅读 2016-10-02 19:09:28
    使用matlab设计编辑的下拉框 1.思路: 查阅大量资料,发现 matlab 在 UI 设计这一块还是较为欠缺,以下有几种思路仅供借鉴: 1.只采用 Pop-Up Menu 实现,通过捕捉键盘输入事件,获取输入的内容,捕捉结束标志...
  • 因为本科并非软工和计算机专业,所以对软件工程中的一些概念理解欠缺。我的编程实践大部分来自于图像处理算法程序的编写,在编程过程中对代码规范,软件设计方面考虑较少。如果要成为一个专业的程序员,就需要学习已...
  • 动态布局的Android抽屉之基础

    万次阅读 多人点赞 2011-09-19 14:07:27
    本文来自http://blog.csdn.net/hellogv/ ,欢迎转摘,引用... 以前曾经介绍过《Android提高第十九篇之"多方向"抽屉》,当这个抽屉组件与周围组件发生压挤的情况下(周围组件布局不变),是比较好使的,但是如果需要对
  • 这可能只是一篇面经(BAT面试)

    万次阅读 多人点赞 2017-07-25 17:21:54
    一两次甚至一系列的失败并不可拍,成功之后反而没有失败总结得透彻,收获的多。失败的经历会让你不断提升能力,成功的经历会让你不断提升信心。而不管成功失败都会提升你的经验,都会有收获。所以不要害怕失败,因为...
  • 最近在一直在用今日头条,发现在我的频道编辑时的拖拽排序体验非常有意思,这种拖拽功能其实在支付宝等app上也频繁... 要想实现这个效果,首先你要了解这几个方面的知识,有欠缺的同学赶紧先补一下: * 使用WindowM
  • 一样的面经】阿里面试,我挂在了第四轮……

    万次阅读 多人点赞 2019-05-27 18:56:35
    可能每个技术人都有个阿里梦,我也例外。最近准备跳槽,前一阵子在准备各种面试,也面了几个大厂,包括阿里。是的,最后我挂在了第四轮。这篇文章来总结一下我在阿里四轮的面试经历,希望能对读者有所启发。 阿里...
  • web前端 | 一条“归路” - 学习路线

    万次阅读 多人点赞 2016-08-15 10:39:35
    记住付出绝对有回报,不可贪快,最后兴趣和付出,都会变成钱(信我!)   --------------------------------------------------------------------------------------------- web前端入坑系列:点击标题...
  • 学妹懂Java泛型来找我,非要我写一篇Java泛型的文章!写完之后还让我写一篇集合的!累载!
  • 第一部分,应对确定性 2 还原论的时代与全新的时代 3 从复杂到错综复杂 4 建立有效组织 第二部分:化繁为简 5 建立互信和目标共享的团队 6 突破“深井”,建立关系 第三部分:信息...
  • 手撕规则碎纸片复原-毕设

    千次阅读 2014-07-03 00:06:58
    这是毕业之后写的第一篇博客,在这里我想把做毕设的... 在最开始的几个星期里,由于数字图像处理相关知识的欠缺,完全知道怎么下手去做,头发快愁白了。从头到尾学一遍matlab图像处理,时间来不及;逛论坛发帖子似乎
  • 只是英文写作指南

    千次阅读 热门讨论 2010-06-06 13:01:00
    作者:朱金灿 来源: ... ... 周日阅读了《英文写作指南》(英文名为《The Elements of Style》)一部分。这本被誉为"英文写作圣经...是我们对这个问题重视,还是我们欠缺这样的人才去出这样的书?
  •  不可否认的是,确实有那么一些人,是真的依靠刷题而获得了入职的机会。世界这么大,总会有幸运的人的。但是,LZ想说的是,面试并不是你大学时的考试,考前临时抱佛脚一下,说不定就混过去了。  面试和你大学时...
  • 穿戴设备未来市场巨大

    千次阅读 2013-10-22 20:58:41
    不可否认,可穿戴设备未来的市场非常之大,甚至极有可能冲击智能手机的存在。 从功能角度讲,可穿戴设备有机会一步步替代智能手机。现阶段来讲,许多可穿戴设备只能算是手机的附庸产品,通讯、社交等功能以手机为...
  • UCRT: VC 2015 Universal CRT, by Microsoft

    千次阅读 2016-11-14 17:18:57
    经Liigo本人测试,在XP SP3系统内,VC2015编译的EXE/DLL除了依赖以上目录内的(几乎)所有dll以外,还额外依赖`vcruntime140.dll`...前面提到的这些dll,共计42个,统统放到EXE/DLL所在目录,确保所有依赖项都不欠缺
  • 动态订制属性的 PropertyGrid

    万次阅读 2008-07-31 22:45:00
    在VB6, VC++, C#.net 里都可以见到一个属性设计器,用来编辑修改 object 的属性。C# 下提供了一个属性设计器 PropertyGrid, 其...不过很多时候我们希望如此,因为欠缺一种灵活性。我希望可以自由的控制需要编辑的内
  • 控硅触发原理

    千次阅读 2018-12-18 13:00:00
    控硅全称“控硅整流元件”(Silicon Controlled Rectifier),简写为SCR,别名晶体闸流管(Thyristor),是一种具有三个PN结、四层结构的大功率半导体器件。控硅体积小、结构简单、功能强,起到变频、整流、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,380
精华内容 15,752
关键字:

不可欠缺