我有一个std::vector<std::pair<int,double>>
,在代码长度和速度方面有没有一种快速的方法来获得:
- a
std::vector<double>
在第二个元素上 - a
std::vector<double>::const_iterator
在第二个元素上而不创建新向量
我没有设法在键入问题时突出显示的问题列表中找到类似的问题。
对于第一个问题,您可以使用转换(在下面的示例中使用来自 c++11 的 lambda)。对于第二个问题,我不认为你可以这样。
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
int main(int, char**) {
std::vector<std::pair<int,double>> a;
a.push_back(std::make_pair(1,3.14));
a.push_back(std::make_pair(2, 2.718));
std::vector<double> b(a.size());
std::transform(a.begin(), a.end(), b.begin(), [](std::pair<int, double> p){return p.second;});
for(double d : b)
std::cout << d << std::endl;
return 0;
}
我认为你想要的是这样的:
std::vector<std::pair<int,double>> a;
auto a_it = a | boost::adaptors::transformed([](const std::pair<int, double>& p){return p.second;});
这将在容器上创建一个转换迭代器(迭代双精度),而不创建容器的副本。
目前我能想到的最简单的方法是:
std::vector<std::pair<int, double>> foo{ { 1, 0.1 }, { 2, 1.2 }, { 3, 2.3 } };
std::vector<double> bar;
for (auto p : foo)
bar.emplace_back(p.second);
我的方式 :
std::pair<int,double> p;
std::vector<std::pair<int,double>> vv;
std::vector<std::pair<int,double>>::iterator ivv;
for (int count=1; count < 10; count++)
{
p.first = count;
p.second = 2.34 * count;
vv.push_back(p);
}
ivv = vv.begin();
for ( ; ivv != vv.end(); ivv++)
{
printf ( "first : %d second : %f", (*ivv).first, (*ivv).second );
}