调用库的问题

时间:2011-04-30 17:52:33

标签: c++ libraries

喜 我正在看一个c ++教程和 讲师包括像这样的图书馆

# include  "map.h"
#include "set.h"

但是当我使用这段代码时我会收到错误

  

致命错误C1083:无法打开包含   file:'set.h':没有这样的文件或   目录

所以我必须像这样写

# include  <map>
#include <set>

但现在我有另一个问题 当我创建一个集合或映射ob时,我可以使用的方法与教程中显示的方法不同 例如,在教程讲师中创建和导航像这样的集合或地图

set<int> ss;
set<int>::itrator itr = ss.itrator();
while(itr.hasnext()){

cout<<itr.next();
}

但我的ss和对象没有这个方法

ss.itrator();
itr.hasnext()
itr.next();

我必须像这样编写这段代码

set<int> ss;
set<int>::itrator itr = ss.begin();
while(!itr.end()){

cout<<*itr;
}

问题是什么?

4 个答案:

答案 0 :(得分:3)

很明显,您的教程不使用标准模板库,并使用自己的自定义库。 #include "set.h"在用户搜索路径中查找set.h文件,该文件通常是当前目录。由于您没有该文件,编译器会发出错误。

当您#include <set>时,您将获得STL set课程。您教程的"set.h"文件可能会为您提供另一个课程(同样适用于<map>"map.h")。

无论如何,如果你正在学习C ++教程,你也可以尝试找一个关于STL的教程,因为它得到了大多数其他C ++库的支持和采用。你可以follow one here

您的代码段的相应代码可能如下:

set<int> ss;
for (set<int>::iterator itr = ss.begin(); itr != ss.end(); itr++)
{
    cout << *itr;
}

而不是ss.iterator(),而是ss.begin(),它返回一个位于集合“开头”的迭代器。您必须将itr.hasnext()itr进行比较,而不是ss.end(); ss.end()返回一个位于集合“end”的迭代器,因此您知道在迭代器与位于集合末尾的迭代器不同的情况下,您没有进行迭代。 itr++*itr取代itr.next()

在您的上下文中,itr.next()都返回当前元素并将迭代器前进一个。这是糟糕的设计,因为该对象无法仅访问当前元素,如果您只想多次访问当前元素,则会导致重复的代码。 STL迭代器具有用于推进和获取引用元素的不同操作:itr++使迭代器前进,*itr获取当前元素。

答案 1 :(得分:1)

很可能这是一个错字:

set<int>::iterator itr = ss.iterator();

答案 2 :(得分:1)

看起来您正在使用Java教程来学习如何使用C ++迭代器。这样的方法是正确的:

set<int> ss;
set<int>::iterator iter = ss.begin();

while (iter != ss.end()){
  cout << *iter <<endl;
  iter++;
}

答案 3 :(得分:0)

#include "set.h"

这将在与包含它的文件相同的目录中查找名为set.h的文件。它告诉你不存在。你需要在那里创建/移动它。

#include <set> 

这是在搜索您的包含路径并找到STL set当然没有您在自己的set.h

中为您的课程定义的方法