Использование std :: transform для разных типов данных

У меня есть пользовательский тип данных с именем atom. Я хочу использовать std :: transform, чтобы заполнить двойной вектор атомом, в котором число «число» является двойным. Я получаю сообщение об ошибке «std :: vector :: iterator» не имеет члена с именем «vec2», где vec2 — мой двойной вектор. Почему это? Можно ли даже использовать два разных типа данных в преобразовании?

atom.h

#ifndef _atom_
#define _atom_
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class atom{

public:

bool operator==(const atom rhs);
double number;
string name;

};
#endif

atom.cpp

#include "atom.h"
atom::atom(){}

atom::~atom(){}

bool atom::operator==(const atom rhs){
return this->name==rhs.name;

}

transformation.h

#ifndef _transformation_
#define _transformation_
#include "atom.h"#include <vector>
#include <algorithm>
using namespace std;struct transformation{double operator() (atom a) const{

return a.number;
}};
#endif

main.cpp

int main(){

vector<atom> vec;atom hydro;
atom oxy;
atom carb;

carb.name = "carbon";
carb.number = 6;

hydro.name="hydrogen";
hydro.number=1;

oxy.name="oxygen";
oxy.number=8;

vec.push_back(hydro);   //here i push atoms into my atom vector
vec.push_back(oxy);
vec.push_back(hydro);
vec.push_back(oxy);
vec.push_back(oxy);
vec.push_back(carb);

vector<double> vec2;
transform(vec.begin(), vec.end(). vec2.begin(), transformation());
}

-2

Решение

Опечатка: у вас есть . вместо ,:

transform(vec.begin(), vec.end(). vec2.begin(), transformation());
^

vec.end() является итератором, и vec.end().vec2 пытается получить доступ к члену vec2 этого итератора.

Далее необходимо убедиться, что vec2 достаточно большой, чтобы принять преобразованные элементы. Вы можете создать его так, чтобы он имел правильный размер с самого начала:

vector<double> vec2(vec.size());
5

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

Ваш код неверен. Помимо опечатки в заявлении

transform(vec.begin(), vec.end(). vec2.begin(), transformation());

где вы используете точку вместо запятой, в заявлении есть ошибка. Вектор vec2 не содержит элементов. Таким образом, вы не можете использовать его в этом утверждении таким образом.

Либо определите вектор как

vector<double> vec2( vec.size() );

transform(vec.begin(), vec.end(), vec2.begin(), transformation());

Или используйте следующий подход

#include <iterator>
//...

vector<double> vec2;
vec2.reserve( vec.size() );

transform(vec.begin(), vec.end(), std::back_inserter( vec2 ), transformation());
0

По вопросам рекламы [email protected]