我怎樣纔能有效地修改使用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