我有一个矢量,我保存对象.我需要将其转换为设置.我一直在阅读关于集合的内容,但我仍然有几个问题:
如何正确初始化它?老实说,一些教程说初始化就好了set<ObjectName> something.其他人说你也需要一个迭代器,比如set<Iterator, ObjectName> something.
如何正确插入它们.再说一次,这就足够了something.insert(object)吗?
如何从set中获取特定对象(例如对象,其中包含名称变量,等于"ben")?
PS我有自己的转换矢量作为一个集(又名我必须使用集而不是矢量).只有set可以在我的代码中.
mas*_*oud 113
假设你有一个字符串向量,将它转换为一个集合你可以:
std::vector<std::string> v;
std::set<std::string> s(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
对于其他类型,您必须已operator<定义.
Dav*_*vid 44
到目前为止,所有答案都已复制vector到a set.由于你要求'转换'a vector到a set,我将展示一个更优化的方法,它将每个元素移动到a set而不是复制每个元素:
std::vector<T> v = /*...*/;
std::set<T> s(std::make_move_iterator(v.begin()),
std::make_move_iterator(v.end()));
Run Code Online (Sandbox Code Playgroud)
注意,您需要C++ 11支持.
izo*_*ica 12
您可以按以下方式使用向量中的对象初始化集合:
vector<T> a;
... some stuff ...
set<T> s(a.begin(), a.end());
Run Code Online (Sandbox Code Playgroud)
这是简单的部分.现在,你必须意识到,为了将元素存储在一个集合中,你需要让bool operator<(const T&a, const T& b)运算符重载.同样在一个集合中,根据运算符定义,您可以拥有不超过一个具有给定值的元素.所以在集合中s你不能有两个既不是operator<(a,b)也不operator<(b,a)是真的元素.只要你知道并意识到你应该好好去.
如果你想要做的就是将你已经拥有的元素存储在一个向量中,在一个集合中:
std::vector<int> vec;
// fill the vector
std::set<int> myset(vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)
你没有告诉我们你的对象,但假设你有这样一个类:
class Thing
{
public:
int n;
double x;
string name;
};
Run Code Online (Sandbox Code Playgroud)
你想把一些东西放到一个集合中,所以你试试这个:
Thing A;
set<Thing> S;
S.insert(A);
Run Code Online (Sandbox Code Playgroud)
这失败了,因为集合已经排序,并且没有办法对Things进行排序,因为没有办法比较它们中的两个.你必须提供operator<:
class Thing
{
public:
int n;
double x;
string name;
bool operator<(const Thing &Other) const;
};
bool Thing::operator<(const Thing &Other) const
{
return(Other.n<n);
}
...
set<Thing> S;
Run Code Online (Sandbox Code Playgroud)
或比较函数对象:
class Thing
{
public:
int n;
double x;
string name;
};
struct ltThing
{
bool operator()(const Thing &T1, const Thing &T2) const
{
return(T1.x < T2.x);
}
};
...
set<Thing, ltThing> S;
Run Code Online (Sandbox Code Playgroud)
要查找名称为"ben"的Thing,您可以遍历该集合,但如果您更具体地告诉我们您想要做什么,那将会非常有用.
| 归档时间: |
|
| 查看次数: |
73699 次 |
| 最近记录: |