2011-04-30 38 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