C++ 移除'#包括<;算法>';不';不要破译密码

C++ 移除'#包括<;算法>';不';不要破译密码,c++,algorithm,C++,Algorithm,也许这是一个非常愚蠢的问题,但我正在读的书指导我编写一段代码,使用算法对向量中的元素进行置乱和排序。为了做到这一点,书告诉我使用算法库从主C++库。好的,到目前为止我理解它,但是在写了代码之后,我想看看如果我从代码的顶部删除这个库,会有什么问题,并且让我惊讶的是,所有的东西都仍然有效 这就是我说的代码。当我从代码的顶部删除“#include algorithm”时,没有任何东西会中断。这怎么可能?不使用此库时,“随机洗牌”部分不应该中断吗 #include <iostream> #i

也许这是一个非常愚蠢的问题,但我正在读的书指导我编写一段代码,使用算法对向量中的元素进行置乱和排序。为了做到这一点,书告诉我使用算法库从主C++库。好的,到目前为止我理解它,但是在写了代码之后,我想看看如果我从代码的顶部删除这个库,会有什么问题,并且让我惊讶的是,所有的东西都仍然有效

这就是我说的代码。当我从代码的顶部删除“#include algorithm”时,没有任何东西会中断。这怎么可能?不使用此库时,“随机洗牌”部分不应该中断吗

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    vector<int>::const_iterator iter;

    cout << "Creating a list of scores.";
    vector<int> scores;
    scores.push_back(1500);
    scores.push_back(3500);
    scores.push_back(7500);

    cout << "\nHigh Scores:\n";
    for (iter = scores.begin(); iter != scores.end(); ++iter)
    {
        cout << *iter << endl;
    }

    cout << "\nFinding a score.";
    int score;
    cout << "\nEnter a score to find: ";
    cin >> score;
    iter = find(scores.begin(), scores.end(), score);
    if (iter != scores.end())
    {
        cout << "Score found.\n";
    }
    else
    {
        cout << "Score not found.\n";
    }

    cout << "\nRandomizing scores.";
    srand(static_cast<unsigned int>(time(0)));
    random_shuffle(scores.begin(), scores.end());
    cout << "\nHigh Scores:\n";
    for (iter = scores.begin(); iter != scores.end(); ++iter)
    {
        cout << *iter << endl;
    }

    cout << "\nSorting scores.";
    sort(scores.begin(), scores.end());
    cout << "\nHigh Scores:\n";
    for (iter = scores.begin(); iter != scores.end(); ++iter)
    {
        cout << *iter << endl;
    }

    system("pause");
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量::常量迭代器iter;
不能在这里休息

janus@Zeus:~$ g++ test.cpp 
test.cpp: In function ‘int main()’:
test.cpp:27:52: error: no matching function for call to ‘find(std::vector<int>::iterator, std::vector<int>::iterator, int&)’
test.cpp:27:52: note: candidate is:
/usr/include/c++/4.6/bits/streambuf_iterator.h:359:5: note: template<class _CharT2> typename __gnu_cxx::__enable_if<std::__is_char<_CharT2>::__value, std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> > >::__type std::find(std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> >, std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> >, const _CharT2&)
test.cpp:39:48: error: ‘random_shuffle’ was not declared in this scope
test.cpp:47:38: error: ‘sort’ was not declared in this scope
janus@Zeus:~$
janus@Zeus:~$g++test.cpp
test.cpp:在函数“int main()”中:
test.cpp:27:52:错误:调用“find(std::vector::iterator,std::vector::iterator,int&)”时没有匹配的函数
测试。cpp:27:52:注:候选人为:
/usr/include/c++/4.6/bits/streambuf_迭代器.h:359:5:注意:模板类型名称_ugnu_cxx::u启用u如果::u类型std::find(std::istreambuf_迭代器,std::istreambuf_迭代器,const CharT2&)
test.cpp:39:48:错误:“random_shuffle”未在此作用域中声明
test.cpp:47:38:错误:未在此作用域中声明“sort”
janus@Zeus:~$

gcc 4.6.1

之所以有效,是因为您还包括了一个标题

例如,vector可能在其源代码中包含了算法。这很常见,因为它们通常只包含头

也就是说,您不能依赖标准库的特定实现在每个头中都包含相同的include(例如,with可能与MSVC一起工作,而它可能与gcc stdlibc++一起中断)


由于这些原因,我极力建议您使用什么,不管它将编译在哪里。---注意,这与“引用什么”略有不同,因为标题中的点和引用的正向声明可以显著地改善构建时间。

< P> C++并没有规定每个包含哪些头。标准标题。这意味着,例如,
可能
#包含库实现A中的
,但不包含在库实现B中。这也可能在同一库的不同版本之间或不同端口上发生变化。例如,glibc++一旦显著清理了它们的包含层次结构

<>这使我们的C++程序员有些不舒服,因为我们应该确保包含正确的代码,即使某些标准的头已经这样做了;如果我们懒惰,我们就可能会在其他平台上中断编译,系统升级和降级。 经验法则:

根据标题的定义,包括必要的内容,但不包括更多内容


“但不是更多”,因为编译时间可能会变得非常慢。

当我删除#include algorithms行时,代码没有为我编译。冒着听起来非常傲慢的风险,你确定你已经重新编译了吗

我的编译器输出:

a.cpp(28) : error C3861: 'find': identifier not found
a.cpp(40) : error C3861: 'random_shuffle': identifier not found
a.cpp(48) : error C3861: 'sort': identifier not found

不幸的是,标准头被允许包含其他标准头,因此不能保证如果您忘记了一个标准头,您的代码会被破坏。

预处理器指令
#include
不“include”链接过程中的库只指示预编译器读取头文件并将其作为单个单元包含在源文件中

也就是说,
算法
头文件可能包含在另一个包含文件中

注意:特定的函数或方法可以在头文件中声明和定义,因此不需要链接

编辑: 您的代码编写得很好,应该可以正常工作。我只建议您使用换行符预定义字符
endl
,并将其包含在输出序列的末尾,而不是下一个序列的开头:

cout << "Creating a list of scores." << endl;  
cout << "High Scores:" << endl;

cout该代码之所以有效,是因为向量内部包含算法。
要验证包含的内容和不包含的内容,可以通过将-E标志传递给编译器来生成预处理器输出

编写一个示例文件:temp.C,它只有一行:

#include <vector>
#包括

现在,如果我们将文件编译为
g++-E temp.C
,您将能够在输出中看到包含的算法。

哪个编译器?如果我在VS2010中删除
#include
,它将无法编译。我使用的是NetBeans IDE 7.1和MinGW。不是这里,也许您使用的是不同的IDE?这不是“这怎么可能?”@phresnel如果这个假设不成立,那么回答这个问题就没有意义了。也许OP使用了奇怪的编译器标志。我坚持认为,看到不同的编译器如何给他不同的结果,可能会回答一些问题,比如它如何不受头文件所包含的头文件的标准的约束。我非常确定。我使用的是NetBeans顺便说一句,也许这是IDE的不同之处?我只是在使用命令行。我已经有一段时间没有使用netbeans了,但我记得当时你必须右键单击项目浏览器中的类,然后单击“重新编译”。(@phresnel:我认为这是一个礼貌的可能答案。他可能不知道include需要重新编译)哎哟,我在一次事故中判断,我真的想在其他地方发表我的评论,对不起。请向上投票,但我认为更容易看到算法被包括在内(就像对我一样)对于g++temp.cpp-MNote,它取决于库实现;您不能依赖
包括
或其他任何东西(事实上,在我的特定实现中,它不依赖)。使用-E标志的建议很好,但是,它没有回答“这怎么可能?”很好。以前从未使用过-M“我们冒着编译在其他平台上中断的风险