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

C++ store iterators in a SET

本文关键字:SET 存储 迭代器 c++      更新时间:2023-10-16

在我的程序中,我有一个集合:(std::set<int> myset;),经过一些处理后,我最终采用了一个迭代器,我已经减速像这样(set<int>::iterator findnumb;)。假设我要在MYSET中这样做5次,5次定义差异迭代器(it1 it2 ....it5)不仅是这个,之后还要根据它们显示的内容进行排序。我的想法是创建一个循环,每次将特定的迭代器放入set和sort中,但我不知道该如何声明。

我创建了一个简单的例子,取用户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;
}

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

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}
}

如果只希望迭代器有序,则最好对输入向量进行排序,并跳过重复元素处理集合。

    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);
    }

如果可以使用向量,就不要使用集合。

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总是会找到集合中的元素,如果不是,它将返回end迭代器,即在最后一个元素之后这

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

是无用和错误的。要测试find是否找到了元素,请使用

if (findnumb != myset.end())

当然,如果你只想知道该元素是否在集合中,那么最好使用count,完全忽略迭代器。

if (myset.count(x) > 0)

如果你只想读值而不想写值,就不要存储迭代器。只存储值本身

在hansmaad的帮助下,我找到了我需要的东西(基于我的代码),非常感谢!!!!!!!!!!!我还有最后一个问题,我如何在set findnumbs!!!!中使用FIND类似set::const_iterator, dereferenced_less>::iterator;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;
}