我怎样才能有效地修改使用STL算法这两个列表的元素:如何修改不同类型列表中的元素?
std::list<std::pair<double, string> > listPair(10);
std::list<double> listA(10);
并以这样的方式使得第一对元素会从listA的相应的双值?
我怎样才能有效地修改使用STL算法这两个列表的元素:如何修改不同类型列表中的元素?
std::list<std::pair<double, string> > listPair(10);
std::list<double> listA(10);
并以这样的方式使得第一对元素会从listA的相应的双值?
在这里,我假设listPair
已经填满,因为没有办法让该字符串,否则。
您可以直接循环访问集合。
auto a_cur = listA.begin(), a_end = listA.end();
auto pair_cur = listPair.begin();
for (; a_cur != a_end; ++ a_cur, ++ pair_cur) {
pair_cur->first = *a_cur;
}
或使用std::transform
的“二进制”的版本,但是这将涉及到复制的字符串:
std::transform(listA.begin(), listA.end(), listPair.begin(), listPair.begin(),
[](double a, std::pair<double, string> b) {
return std::make_pair(a, b.second);
});
我想使用第一个块的代码;但我想过使用stl算法,因为它减少了我侵入的代码量,并且使其他人更容易阅读。每当我尝试使用stl算法时,它们(以及它们所调用的函数对象)似乎都非常依赖复制数据,这在我的情况下使代码不那么高效。 – tmaric 2012-07-13 11:26:37
尝试使用C++ 11 lambda表达式
#include <algorithm>
#include <list>
#include <string>
#include <utility>
int main()
{
std::list<std::pair<double, std::string> > listPair(10);
std::list<double> listA(10);
// original question: assign double of listA to listPair
std::transform(
listA.begin(), listA.end(), listPair.begin(), listPair.begin(),
[](double d, std::pair<double, std::string> const& p) {
return std::make_pair(d, p.second);
}
);
// other way around: assign double from listPair to listA
std::transform(
listPair.begin(), listPair.end(), back_inserter(listA),
[](std::pair<double, std::string> const& p) {
return p.first;
}
);
return 0;
}
我认为问题是要求以其他方式来做......即使用'listA'填充'listPair',也不应该像'inserter'这样的迭代器适配器,因为目标列表将是空的。 – Naveen 2012-07-13 10:35:47
@Naveen你说得对,会纠正它。 – TemplateRex 2012-07-13 10:39:57
哎呀..我对我的评论的第二部分错了。在'listA'中已经构建了'10'个默认对象。 – Naveen 2012-07-13 10:41:17
你为什么做两个列表?更有效地使用std :: map。 否则,我没有其他的选择,但采取两个迭代器,并作出一个简单的循环 – Bentoy13 2012-07-13 10:31:48
我必须使用两个列表。其实,这是一个(非常)细分的例子。 – tmaric 2012-07-13 11:24:48