在我的程序中我有一个集合:(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;
}
答案 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)
#
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;
}