У меня есть пользовательский тип данных с именем 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());
}
Опечатка: у вас есть .
вместо ,
:
transform(vec.begin(), vec.end(). vec2.begin(), transformation());
^
vec.end()
является итератором, и vec.end().vec2
пытается получить доступ к члену vec2
этого итератора.
Далее необходимо убедиться, что vec2
достаточно большой, чтобы принять преобразованные элементы. Вы можете создать его так, чтобы он имел правильный размер с самого начала:
vector<double> vec2(vec.size());
Ваш код неверен. Помимо опечатки в заявлении
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());