C++ 中map中是数怎么经过for循环提取出来,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 中map中是数怎么经过for循环提取出来,相关的知识,希望对你有一定的参考价值。

例如 map<int,int> mp;
map<int,int>::iterator iter;
int main()


mp.clear();

int n,t;

while(~scanf("%d",&n))



for(int i=0;i<n;i++)



scanf("%d",&t);mp[t]++;



for(iter=mp.begin();iter<????;iter++)//要取前K个数,这个限制条件改怎么写?

cout<<(iter->first)<<" ";



return 0;

参考技术A for(iter=mp.begin();iter<????;iter++)//要取前K个数,这个限制条件改怎么写?
cout<<(iter->first)<<" ";
可以改成

iter=mp.begin();

int k;
while(k)

cout<<(iter->first)<<" ";
k--;
iter++;

你的map是用insert()进行插入的 你写的我觉得有问题
欢迎追问追问

我之所以不另外定义一个变量来记录数据个数,是想万一我不是从map中的第一个数开始,而是想找出第3到第5个数,这样我是需要先iter=mp.begin()循环到第3个,再开始输出,没有直接可以从第三个开始输出,就比如说数组,我可以for(int i=3;i<=5;i++)cout<<a[i]<<endl;但是在map中我改怎么写呢

追答

int i=0;
for(iter=mp.begin(),int i=0;iterfirst)<<" ";//取前K个数
else
break;

追问

iter<mp.end()不能这么写吧,是iter!=mp.end()吧?还有好像还是没有说明怎么取出第k1到k2的数,不过还是谢谢啦

追答

for(iter=mp.begin(),int i=0;iter!=mp.end();iter++,i++)

if(ifirst)<<" ";//取前K个数;

//不你的问题 欢迎追问

追问

比如我又10000个数我要算出9998到10000这区间的数,按上面的for循环还是要循环10000次,复杂度还是比较高,没有其他的方法了吗?

追答

map是二叉树型存储的结构 是关连型容器
二叉树搜索很快的 而且只能从头开始遍历树
欢迎追问

本回答被提问者采纳
参考技术B 定义一个迭代器(以int&int的map为例):map<int,int>::iterator mapi;
然后遍历map就可以写成
for(mapi=map.begin;mapi!=map.end;mapi++)

int a=mapi->first;

int b=mapi->second;

参考技术C CMap<int,int,CPoint,CPoint> myMap;
int i;

myMap.InitHashTable( 257 );

// Add 10 elements to the map.
for (i=0;i < 200;i++)
myMap[i] = CPoint(i, i);

// Remove the elements with even key values.
CPoint pt;
for (i=0; myMap.Lookup( i, pt ) ;i+=2)

myMap.RemoveKey( i );


#ifdef _DEBUG
ASSERT(myMap.GetCount() == 100);
afxDump.SetDepth( 1 );
afxDump << "myMap: " << &myMap << "\n";
#endif
参考技术D 没理解你取前几个数是什么意思,是取出前几个pair还是取出每个pair的第一个元素还是每个pair的第二个元素?追问

就是map中有10个数0,1,2,3,4,5,6,7,8,9,mp[0]=2,mp[1]=3。。。。现在我不管0,1,2.。。这些数具体的个数,我只要求出map中前5项的“值”,怎么经过for循环提取出来

追答

int i = 5;
map a;
for(map::iterator imap = a.begin();
i != 6; ++i)

coutfirstsecond;
++imap;


看看你是不是这个意思
不好意思刚才写的有点错

第5个回答  2013-01-31 定义一个 int step = 0;
每次循环+1;
if (step >= k)
break;追问

这个我知道,我想知道的是for循环中有没有一个写法,比如vector中,我定义vectorvec;
提取前K个数就可以写成for(iter=vec.begin();iter<vec.begin+K;iter++) 但map不能这么写,它是否有其他写法?

如何在 C++ 中使用 for 循环输出向量中的所有对象

【中文标题】如何在 C++ 中使用 for 循环输出向量中的所有对象【英文标题】:How can I output all objects in a vector using for loop in c++ 【发布时间】:2020-06-03 02:03:10 【问题描述】:

BookLibrary 类构造BookInfo 类对象的向量。任务是将一些“书籍”(BookInfo 类的对象)添加到向量中并打印出来。出于某种原因,传统的for(unsigned int i = 0; i &lt; vector.size(); i++) cout &lt;&lt; vector[i] &lt;&lt; endl; 循环不起作用。这是 Savitch 教科书“用 C++ 解决问题”中的一个家庭作业项目。

代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class BookInfo

public:
    BookInfo(string newAuthor, string newTitle);
    BookInfo(string newTitle);
    string getName();
    string getAuthor();
    string getTitle();
private:
    string author;
    string title;
;

class BookLibrary

public:
    BookLibrary();
    BookLibrary(vector<BookInfo> newLibrary);
    void add(BookInfo newBook);
    void size();
    void printInfo();
private:
    vector<BookInfo> library;
;

int main()

    BookLibrary library1;
    BookInfo book1("Michael Krichton", "Jurassic Park");
    BookInfo book2("War and Peace"), book3("Valter Savitch", "Programming in C++");
    library1.add(book1);
    library1.add(book2);
    library1.add(book3);
    library1.size();
    library1.printInfo();
    return 0;


BookInfo::BookInfo(string newAuthor, string newTitle)

    author = newAuthor;
    title = newTitle;


BookInfo::BookInfo(string newTitle) :
    title(newTitle), author("unknown")


string BookInfo::getName()

    return (author + " " + title);


string BookInfo::getAuthor()

    return author;


string BookInfo::getTitle()

    return title;


BookLibrary::BookLibrary()


BookLibrary::BookLibrary(vector<BookInfo> newLibrary)

    library = newLibrary;


void BookLibrary::add(BookInfo newBook)

    library.push_back(newBook);


void BookLibrary::size()

    cout << library.size();


void BookLibrary::printInfo()

    for (unsigned int i = 0; i < library.size(); i++)
        cout << library[i] << endl;

它在最后一行的cout &lt;&lt; 下划线。

【问题讨论】:

BookInfo需要提供operator&lt;&lt; “不工作”不是一个有用的问题描述。这就像通过说“我的车不动”来向机械师解释您的汽车问题。 编译器 'complains': "error C2679: binary ' @kanulilewa 正如cigien所说,您需要为BookInfo定义一个operator&lt;&lt; 我不确定我是否熟悉这个,我该如何定义它? 【参考方案1】:

您的循环无法打印出BookInfo 对象,因为您尚未为BookInfo 定义operator&lt;&lt;。因此,像cout &lt;&lt; library[i] 这样的语句不知道如何处理library[i] 返回的BookInfo

你需要添加那个操作符,例如:

class BookInfo

public:
    ...

    friend ostream& operator<<(ostream &os, const BookInfo &book)
    
        os << "\"" << book.title << "\" by " << book.author;
        return os;
    

    ...
;

如果您想改用 getName() 方法,则需要将其声明为 const(无论如何您都应该为所有的 getter 这样做),例如:

class BookInfo

public:
    ...
    string getName() const;
    ...

    friend ostream& operator<<(ostream &os, const BookInfo &book)
    
        os << book.getName();
        return os;
    

    ...
;

string BookInfo::getName() const

    return ...;

【讨论】:

非常感谢,这对我来说是新的,我会尝试将其添加到我的代码中 效果很好!!!这是更新后的代码: class BookInfo public: BookInfo(string newAuthor, string newTitle); BookInfo(string newTitle);字符串 getName() 常量;字符串 getAuthor();字符串 getTitle();朋友 ostream& operator 这个主题叫ostream吗?我想对这件事做更多的研究,因为这对我来说是新的

以上是关于C++ 中map中是数怎么经过for循环提取出来,的主要内容,如果未能解决你的问题,请参考以下文章

C++ for循环中vector和map的erase

C++ for循环中vector和map的erase

如何提取for循环的主体? [复制]

for循环遍历map

JS中一个字符串如“[,,]”所示,大括号中是JSON键值对,请问 这个字符串中的数组如何提取出来呢,

java.util.map<string,object> idea怎么提取出来