stl — В C ++, как вы получаете итератор на втором элементе вектора пары

у меня есть std::vector<std::pair<int,double>>Есть ли быстрый способ с точки зрения длины кода и скорости для получения:

  • std::vector<double>на втором элементе
  • std::vector<double>::const_iteratorна втором элементе без создания нового вектора

Мне не удалось найти аналогичный вопрос в списке вопросов, выделенных при наборе вопроса.

4

Решение

Для первого вопроса вы можете использовать transform (с лямбдой из c ++ 11 в моем примере ниже).
Что касается второго вопроса, я не думаю, что вы можете иметь это.

#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;
}
6

Другие решения

Я думаю, что вы хотите что-то вроде:

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

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

Который создаст итератор преобразования над контейнером (итерация по двойникам), не создавая копию контейнера.

6

Самое простое, о чем я могу подумать в данный момент, это что-то вроде:

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

Мой метод :

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 );
}
0
По вопросам рекламы [email protected]