c++ - 从 std::vector 创建/填充 std::set 的 STL 方式

标签 c++ c++11 stl stdvector stdset

我想从 set 的每个条目的成员变量的内容中创建和填充 vector 。这就是我正在做的:

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> 中的任何可用方法?

最佳答案

您始终可以将 vector 定义的范围中的 std::transform 应用到 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)
);

关于c++ - 从 std::vector 创建/填充 std::set 的 STL 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166733/

相关文章:

c++ - Xcode C++ 窗口应用程序

c++ - 如何在 C++ 中使用 Boost::regex.hpp 库?

C++ 警告数组下标的类型为 'char'

c++ - 有没有办法提取模板的参数列表以放入另一个元函数?

c++ - 需要在 Solaris 10 上为 GNU g++ 2.95.3 放置线程安全的 std::string

c++ - 有没有比 allocator_type 更好的方法来区分可调整大小的容器?

c++ - 将文件的全部内容读取到标准输出的最短方法是什么?

c++ - C++ 标准是否支持进程?

c++ - 为什么 priority_queue 没有 front() 而有 top()

c++ - 调用C++/STL算法时消除不必要的拷贝