c++将迭代器存储在SET中
C++ store iterators in a SET
在我的程序中,我有一个集合:(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;
}
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 为什么我无法更改"set<set>"循环中的值<int>
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- std::set 是否将对象连续存储在内存中?
- 为什么我的 std::set 不存储唯一值?
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- "Flattening" std::set<std::string> 用于存储和比较?
- 存储对std::set对象的引用/指针
- 如何在 std::set 中存储指向对象的指针(或引用)
- 查找 std::set 中的键成对存储
- C++:STL:set:存储值常量
- 在std::set/std::map中存储具有多个不同类型字段的c++对象的有效方法
- 从std::vector存储到std::set,其中vector包含一个结构体,而std::set只包含该结构体中的一个
- c++将迭代器存储在SET中
- 指针是否存储在 std::set const 中
- 如何在std::set中存储2D几何向量