gpt4 book ai didi

c++ - 从 std::vector 存储到 std::set,其中 vector 包含一个结构,但 std::set 仅包含结构中的一个元素

转载 作者:太空狗 更新时间:2023-10-29 23:40:46 25 4
gpt4 key购买 nike

如何将作为元素结构的 vector 的所有元素复制到集合中。

    struct info
{
std::string code;
std::string curDate;
int iVar;

};

std::vector<info> infVect; // Load data into the vector from the database

std::set<std::string> uniqueCodes;


for ( int i = 0; i < infVect.size() ; ++i)
uniqueCodes.insert(infVect[i].code);

有没有更快的方法来将元素从 vector 存储到 set 而无需迭代循环中的每个元素?

注意:

std::set<std::string> uniqueCodes(infVect.begin(), infVect.end() ) , 如果 infVect 会起作用只有代码。但是infVect是对象的 vector 。

最佳答案

您的代码绝对没问题。 for loop 是表达你在这种情况下的意思的最简单方法。基于 C++11 范围的 for更简单:

for (const auto& i : infVect)
uniqueCodes.insert(i.code);

如果您只是为了拥有一个替代品而想要一个替代品,这里是通过仅将 STL 功能粘合在一起来实现的方法。

通过 std::transform 运行它提取成员并将其插入到 set 中. mem_fn helper 将成员函数或成员变量转换为仿函数。

std::transform(
infVect.begin(),
infVect.end(),
std::inserter(uniqueCodes, uniqueCodes.end()),
std::mem_fn(&info::code)
);

如果code是私有(private)的,你需要一个 setter/getter 给mem_fn .

const std::string& getCode() const { return code; }

您需要以下 header 。

#include <algorithm>  // transform
#include <functional> // mem_fn
#include <iterator> // inserter

如果您不关心保留原始 vector , 你可以使用 std::move_iterator 在 C++11 中移动字符串而不重新分配,并避免 <functional> mem_fn 的依赖项通过使用 lambda。

using namespace std; // for brevity
transform(
make_move_iterator(begin(infVect)),
make_move_iterator(end(infVect)),
inserter(uniqueCodes, end(uniqueCodes)),
[](info&& x) { return move(x.code); }
);

关于c++ - 从 std::vector 存储到 std::set,其中 vector 包含一个结构,但 std::set 仅包含结构中的一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com