在C ++中,如何在对向量的第二个元素上获得迭代器

时间:2012-09-06 11:03:23

标签: c++ stl

我有一个std::vector<std::pair<int,double>>,在代码长度和速度方面有快速获取方法:

  • 第二个元素上的std::vector<double>
  • 第二个元素上的std::vector<double>::const_iterator,而不创建新的向量

我在输入问题时突出显示的问题列表中找不到类似的问题。

4 个答案:

答案 0 :(得分:6)

对于第一个问题,您可以使用transform(在下面的示例中使用来自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;
}

答案 1 :(得分:6)

我认为你想要的是:

std::vector<std::pair<int,double>> a;

auto a_it = a | boost::adaptors::transformed([](const std::pair<int, double>& p){return p.second;});

这将在容器上创建转换迭代器(迭代双打),而不创建容器的副本。

答案 2 :(得分:1)

目前我能想到的最简单的事情就像:

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);

答案 3 :(得分:0)

我的方式:

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 );
}