请考虑以下事项:
struct A
{
int i;
double d;
std::string s;
};
std::list<A> list_A;
我想将list_A的所有元素复制到地图中,以便地图中的每一对都包含list_A中的元素作为值,其字符串s
作为键。有没有办法比循环遍历列表更优雅,并将每个元素及其字符串作为地图的键插入?
答案 0 :(得分:6)
这可以让您了解如何使用transform
:
std::pair<std::string, A> pairify(const A& a) { return std::make_pair(a.s, a); }
std::transform(list.begin(), list.end(), std::inserter(map, map.end()), pairify);
插入迭代器是一种特殊类型的输出迭代器,旨在允许通常覆盖元素(例如复制)的算法自动在容器中的特定位置插入新元素。
答案 1 :(得分:4)
我喜欢标准的库算法和lambda,但它并没有比以下简单得多:
for (const A& value : list_A) {
map_A.insert(std::make_pair(value.s, value));
}
其他方法正在执行此代码的等效操作,并且此循环可读且同样快。
答案 2 :(得分:1)
很抱歉上次没有回复太快,没有详细信息,这是一个可编辑的代码。
struct A
{
int i;
double d;
std::string s;
};
std::list<A> list_A;
std::pair<std::string, A> convert(const A &x) {
return make_pair(x.s,x);
}
int main() {
std::map<std::string,A> out;
std::transform(list_A.begin(), list_A.end(), std::inserter(out,out.end()),convert);
}
答案 3 :(得分:0)
我可以将它存储在set
中:这样地图中就不存在数据重复(s本身):
struct A
{
bool operator < (const A& r_) const { return (s < r_.s); }
int i;
double d;
std::string s;
};
std::list<A> list_A;
std::set<A> set_A;
for ( std::list<A>::const_iterator itr = list_A.begin(); itr != list_A.end(); ++itr ) {
if ( ! set_A.insert(*itr).second ) {
// Handle duplicated elements
}
}
我可以保持循环:通过这种方式,您可以正确处理重复的元素。
答案 4 :(得分:0)
如果您使用C ++ 11,则可以将lambda函数与capture:
一起使用std::map<std::string, A> m;
std::list<A> l;
std::for_each(l.begin(), l.end(),
[&](const A& a) {
m.insert(std::make_pair(a.s, a));
});