C ++将迭代器存储在SET中

时间:2014-06-20 13:01:04

标签: c++

在我的程序中我有一个集合:(std::set<int> myset;)经过一些处理后我终于拿出一个迭代器,我已经减速了这个(set<int>::iterator findnumb;)。好吧,我必须在MYSET中做5次这样的事情,5次定义差异迭代器(it1,it2,.... it5),不仅如此,而且在此之后按照它们显示的内容对它们进行排序。我的想法是创建一个循环,每次都将特定的迭代器放在一个集合中,但我不知道如何声明它。

我创建了一个简单的示例,它取用于用户5的数字,并从我们的集合中找到最接近的更大并打印它。但是在每个循环中旧的迭代器都替换为新的迭代器,而在我的实际程序中,我希望将这个迭代器存储在一个集合中。基于此,您可以修改此示例并将迭代器按其显示的内容存储在集合中。

#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main() 
{

    std::set<int> myset;
    for (int i=1; i<=20; ++i) 
    {myset.insert(i*10);}


    vector<int> vect;
    int numb;
    for (int i=0; i<5; ++i) 
    {
        cout << "give a number" <<endl;
        cin >> numb;
        vect.push_back(numb);
    }

    set<int>::iterator findnumb;
    for (vector<int>::iterator it = vect.begin(); it != vect.end(); ++it)
    {
        findnumb=myset.find(*it);
        while ( (*findnumb)!=(*it))
        { ++(*it); findnumb=myset.find(*it);}
        cout << *findnumb<<" ";
    }
    cout << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了你的问题。

struct dereferenced_less {
    template<typename I>
    bool operator()(const I& lh, const I& rh) const { return *lh < *rh; }
};


int main()
{
    using namespace std;

    set<int> myset = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
    vector<int> vect = { 17, 32, 4, 16, 28, 120 };

    set<set<int>::const_iterator, dereferenced_less> findnumbs;
    for (int i : vect)
    {
        auto findnumb = myset.upper_bound(i);
        if (findnumb != end(myset))
            findnumbs.insert(findnumb);
    }

    // findnumbs: {10, 20, 30, 40}
}

如果你只想要迭代器的顺序,最好对输入向量进行排序并处理跳过dupklicate元素的集合。

    vector<set<int>::const_iterator> result;
    sort(begin(vect), end(vect));

    for (int i : vect)
    {
        auto find = myset.upper_bound(i);
        if (find != end(myset) && (result.empty() || *result.back() != *find))
            result.push_back(find);
    }

答案 1 :(得分:0)

不要使用可以使用向量的集合。

和这个

for (vector<int>::iterator it = vect.begin(); it != vect.end(); ++it)

你如何遍历矢量!迭代器被用于模板算法,一个无法随机访问的容器。这就是你使用向量的方式

for (size_t i = 0; i < vect.size(); ++ i)

vec[i] // the i-th element 

或使用新语法

for (int x : vect)

x // the i-th element

同样find将总是在集合中找到元素,否则它将返回结束迭代器,这是在最后一个元素之后 所以这个

findnumb=myset.find(*it);
while ( (*findnumb)!=(*it))
{ ++(*it); findnumb=myset.find(*it);}

没用,也没错。测试是否找到了元素使用

if (findnumb != myset.end())

当然,如果您只想知道元素是否在集合中,那么最好使用count并忘记迭代器。

if (myset.count(x) > 0)

如果您只想读取值而不是写入它,则不要存储迭代器。只需存储值本身

答案 2 :(得分:0)

在hansmaad的帮助下,我发现了我需要的东西(根据我的代码),非常感谢。!!!!!!!!!!!另外我还有一个问题,我如何在set findnumbs中使用FIND !!!!比如set :: const_iterator,dereferenced_less&gt; :: iterator ithelp; ithelp = findnumbs.find(20)

#

include <iostream>
#include <set>
#include <vector>
#include <algorithm>   

struct dereferenced_less {
    template<typename I>
    bool operator()(const I& lh, const I& rh) const { return *lh < *rh; }
};


int main()
{
    using namespace std;

    set<int> myset;
    for (int i=1; i<=10; ++i) 
    {myset.insert(i*10);}   
    int vc[] = { 17, 32, 4, 16, 28 };
    vector<int> vect ;
    vect.assign (vc, vc+5);
    set<set<int>::const_iterator, dereferenced_less> findnumbs;
    set<int>::iterator findnumb;
    for (std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
    { cout << *i << endl; }
    for (std::vector<int>::iterator i = vect.begin(); i != vect.end(); ++i)
    {
        findnumb = myset.find(*i);
        while ( (*findnumb)!=(*i))
        { ++(*i); findnumb=myset.find(*i);}
            findnumbs.insert(findnumb);
            cout << *findnumb<<" ";
    }

    for (set<set<int>::const_iterator, dereferenced_less>::iterator it=findnumbs.begin(); it!=findnumbs.end(); ++it)
    std::cout << ' ' << *(*it);

  std::cout << '\n';
    return 0;
}