creating/filling std::set 来自 std::vector 的 STL 方式
STL way of creating/filling std::set from std::vector
我想根据 vector
的每个条目的成员变量的内容创建并填充 set
。这就是我正在做的:
struct S { int i; };
int main()
{
std::vector<S*> structPtrs;
// code to fill the above vector
// create set from the above vector
std::set<int> setInts;
for (auto it = structPtrs.begin(); it != structPtrs.end(); ++it)
{
setInts.insert((*it)->i);
}
}
有STL的方法吗?或者通过 <algorithm>
?
中的任何可用方法
您可以随时申请 std::transform
from the range defined by the vector onto the "range" defined by an std::inserter
:
transform(begin(structPtrs), end(structPtrs),
inserter(setInts, end(setInts)), [] (S* s) {
return s->i;
});
使用标准库应该绰绰有余了。
如果您愿意超越标准库,还可以选择使用类似 boost::transform_iterator
的东西,这将允许您将范围转换移动到集合的初始化中:
auto transfomer = [](S* s) { return s->i; };
std::set<int> setInts(
boost::make_transform_iterator(begin(structPtrs), transfomer),
boost::make_transform_iterator(end(structPtrs), transfomer)
);
您可以将 std::transform
与适当的 lambda 和插入迭代器一起使用:
std::transform(structPtrs.begin(), structPtrs.end(), std::inserter(setInts, setInts.end()),
[](S* sp) { return sp->i; });
但就个人而言,我发现一个简单的循环范围更容易遵循:
for (S* sp : structPtrs)
setInts.insert(sp->i);
还有另一种方法可以做到这一点。如果将 int
的转换运算符添加到结构中,则可以直接使用范围构造函数
#include <iostream>
#include <set>
#include <vector>
using namespace std;
struct test {int i; operator int() {return i;}};
int main() {
vector<test> v;
v.push_back(test{433});
v.push_back(test{533});
set<int> s(v.begin(), v.end());
cout << *(++s.begin());
return 0;
}
我想根据 vector
的每个条目的成员变量的内容创建并填充 set
。这就是我正在做的:
struct S { int i; };
int main()
{
std::vector<S*> structPtrs;
// code to fill the above vector
// create set from the above vector
std::set<int> setInts;
for (auto it = structPtrs.begin(); it != structPtrs.end(); ++it)
{
setInts.insert((*it)->i);
}
}
有STL的方法吗?或者通过 <algorithm>
?
您可以随时申请 std::transform
from the range defined by the vector onto the "range" defined by an std::inserter
:
transform(begin(structPtrs), end(structPtrs),
inserter(setInts, end(setInts)), [] (S* s) {
return s->i;
});
使用标准库应该绰绰有余了。
如果您愿意超越标准库,还可以选择使用类似 boost::transform_iterator
的东西,这将允许您将范围转换移动到集合的初始化中:
auto transfomer = [](S* s) { return s->i; };
std::set<int> setInts(
boost::make_transform_iterator(begin(structPtrs), transfomer),
boost::make_transform_iterator(end(structPtrs), transfomer)
);
您可以将 std::transform
与适当的 lambda 和插入迭代器一起使用:
std::transform(structPtrs.begin(), structPtrs.end(), std::inserter(setInts, setInts.end()),
[](S* sp) { return sp->i; });
但就个人而言,我发现一个简单的循环范围更容易遵循:
for (S* sp : structPtrs)
setInts.insert(sp->i);
还有另一种方法可以做到这一点。如果将 int
的转换运算符添加到结构中,则可以直接使用范围构造函数
#include <iostream>
#include <set>
#include <vector>
using namespace std;
struct test {int i; operator int() {return i;}};
int main() {
vector<test> v;
v.push_back(test{433});
v.push_back(test{533});
set<int> s(v.begin(), v.end());
cout << *(++s.begin());
return 0;
}