【问题标题】:problem with calling libraries调用库的问题
【发布时间】:2011-04-30 17:52:33
【问题描述】:

嗨 我正在看一个 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 和 object 没有这个方法

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

我必须像这样写这段代码

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

cout<<*itr;
}

有什么问题?

【问题讨论】:

    标签: c++ libraries


    【解决方案1】:

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

    当您#include &lt;set&gt; 时,您将获得 STL set 类。您的教程的 "set.h" 文件可能会给您另一个课程(&lt;map&gt;"map.h" 也是如此)。

    无论如何,如果您正在学习 C++ 教程,您不妨尝试查找有关 STL 的教程,因为与大多数其他 C++ 库相比,它得到了更广泛的支持和采用。你可以follow one here

    您的 sn-p 的相应代码可能如下:

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

    你有ss.begin(),而不是ss.iterator(),它返回一个定位到你的集合“开始”的迭代器。您必须将itrss.end() 进行比较,而不是itr.hasnext()ss.end() 返回一个位于集合“末尾”的迭代器,因此您知道您没有完成迭代,而您的迭代器与位于集合末尾的迭代器不同。 itr++*itr 代替 itr.next()

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

    【讨论】:

    • Nitpick: for ( std::&lt;int&gt;:: **const_**iterator itr = ss.begin(), **end = ss.end()**; itr != end ; **++**itr).
    • @mmutz 为了简单起见,我自愿将const 迭代器排除在我的答案之外。其余的,我承认我从未在for 循环的前提下做过类似end = ss.end() 的事情(collection.end() 从未出现在我的任何程序的分析报告中)。
    • nitpick (1) :) 关于end = ss.end():这叫做“避免过早悲观”。
    【解决方案2】:

    很可能是错字:

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

    【讨论】:

    • 我很确定是ss.begin()。在这种情况下,这不仅仅是一个错字。
    • 谁投了反对票,为什么? @zneak,这并不意味着我的答案是错误的。我回答了用户问题,是my ss and object doesn't have this methods
    • 你说得对,std::set 没有 itrator 方法,但它也没有 iterator 方法。 std::set&lt;T&gt;::iterator 成员是 typedef,类型不可调用。但是,它确实有一个begin 方法。 (不过,我不是反对者。)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      #include "set.h"
      

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

      #include <set> 
      

      那是搜索您的包含路径并找到 STL set,它当然没有您在自己的 set.h 中为您的类定义的方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-12
        • 2011-10-14
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        相关资源
        最近更新 更多