Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从std::vector创建/填充std::set的STL方法_C++_C++11_Stl_Stdvector_Stdset - Fatal编程技术网

C++ 从std::vector创建/填充std::set的STL方法

C++ 从std::vector创建/填充std::set的STL方法,c++,c++11,stl,stdvector,stdset,C++,C++11,Stl,Stdvector,Stdset,我想从向量的每个条目的成员变量的内容中创建并填充一个集合。这就是我正在做的: 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 = structP

我想从
向量
的每个条目的成员变量的内容中创建并填充一个
集合
。这就是我正在做的:

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);
    }
}
结构{int i;}; int main() { std::向量结构; //填充上述向量的代码 //从上面的向量创建集合 std::设置setInts; 对于(自动it=structPtrs.begin();it!=structPtrs.end();++it) { setInts.insert((*it)->i); } } 有什么STL方法可以做到这一点吗?或者通过

中的任何可用方法,您始终可以从矢量定义的范围应用到以下定义的“范围”:

这应该足以使用标准库了


如果您愿意查看标准库之外的内容,还可以使用类似的选项,这将允许您将范围转换移动到集合的初始化中:

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)
);
autotransformer=[](S*S){返回S->i;};
std::set setInts(
boost::make_transform_迭代器(begin(structPtrs)、transformer),
boost::make_transform_迭代器(end(structPtrs)、transformer)
);

您可以使用带有适当lambda和插入迭代器的
std::transform

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;
}
#包括
#包括
#包括
使用名称空间std;
结构测试{int i;运算符int(){return i;};
int main(){
向量v;
v、 推回(测试{433});
v、 推回(测试{533});
设置s(v.begin(),v.end());

非常感谢您格式化@RHertel代码!很好的方式。但是不可维护,因为生产代码在
结构中有更多的变量。
#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;
}