喜 我正在看一个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;
}
问题是什么?
答案 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