2011-04-30 56 views
2

喜 我在看一个C++教程和 教练包括这样问题调用库

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

但是当我使用此代码我收到错误

致命错误C1083库:无法打开包括 文件:'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; 
} 

是什么问题?

回答

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(),您必须将itrss.end()进行比较; ss.end()返回一个定位到该集合“结尾”的迭代器,所以你知道你没有完成迭代,而你的迭代器与定位到集合末尾的迭代器不同。 itr++*itr代替itr.next()

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

+0

Nitpick:'for(std :: ::'** const _ **'iterator itr = ss.begin(),'** end = ss.end()**'; itr!= end;'** ++ **'ITR)'。 – 2011-04-30 18:09:00

+0

@mmutz为了简单起见,我自愿离开'const'迭代器。剩下的,我承认我从来没有在'for'循环的前提下做过类似'end = ss.end()'的事情('collection.end()'从来没有出现在我的任何程序的分析报告中)。 – zneak 2011-04-30 18:12:40

+0

[nitpick(1)](http://en.wiktionary.org/wiki/nitpick):)关于'end = ss.end()':它被称为“避免过早悲观”。 – 2011-04-30 18:16:59

1

最有可能这是一个错字:

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

我敢肯定它的'ss.begin为你的类中定义的方法( )'。在这种情况下,它不仅仅是一个错字。 – zneak 2011-04-30 17:56:44

+0

谁downvoted,为什么? @zneak,这并不意味着我的回答是错误的。我回答了用户问题,即“我的ss和对象没有这个方法”。 – karlphillip 2011-04-30 18:17:16

+0

你说得对,'std :: set'没有'itrator'方法,但它也没有'iterator'方法。 'std :: set :: iterator'成员是一个typedef,并且类型不可调用。不过,它确实有一个“开始”方法。 (不过,我不是downvoter。) – zneak 2011-04-30 18:20:04

1

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

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

while (iter != ss.end()){ 
    cout << *iter <<endl; 
    iter++; 
} 
0
#include "set.h" 

这看起来对于在同一个目录,包括它的文件名为set.h文件。它告诉你,不存在。你需要创建它/在那里移动它。

#include <set> 

这是搜索include路径,并找到STL set这当然没有你在你自己的set.h