Pregunta

Tengo dos vectores de carrozas y yo quiero que ellos se convierten en un vector de números Complejos.Estoy atascado.No me importa el uso de iteradores, pero estoy seguro de que sería redescubriendo la rueda no estoy informado.Es mi código que me lleva en la dirección correcta?

typedef std::vector<float> CVFloat;
CVFloat vA, vB;
//fil vectors
typedef std::complex<CVFloat> myComplexVector;
myComplexVector* vA_Complex = new myComplexVector(vA, vB);

El código de arriba se va a través del compilador correctamente, pero cuando quiero entrar sola números de myComplexVector el uso de iterador tengo un error "Undefined symbol 'const_iterator'" (Borland C++)

myComplexVector::const_iterator it = vA_Complex->begin();
¿Fue útil?

Solución

A continuación, se crea un objeto "complejo" cuyas partes real e imaginaria son vectores de flotadores.
Tal vez lo que realmente quiere hacer es crear un vector de objetos complejos cuyas partes real e imaginaria son los flotadores?

EDIT: myComplexVector es no un vector, es un complejo. Es por eso que una const_iterator porque no está definido.

Otros consejos

Puede crear una función general "zip" teniendo iteradores a ambos vectores, y un funtor convertidor y un iterador de salida:

template< typename at_It1, typename at_It2, typename at_Transform, typename at_Out >
void zip( at_It1 from1, const at_It1 to1, 
          at_It2 from2, const at_It2 to2,
          at_Transform  tranformer,
          at_Out& av_Out ) {
    while( from1 != to1 ) {
        av_Out = transformer( *from1, *from2 );
        ++av_Out; ++from1; ++from2;
    }
}

struct DoubleToComplex {
     complex<double> operator()( const double d1, const double d2 ) const {
         return complex<double>( d1, d2 );
     }
};



zip( vA.begin(), vA.end(),
     vB.begin(), vB.end(),
     DoubleToComplex(),
     std::back_inserter( vTarget ) );

Y me gustaría que hubiera una función de este tipo en el STL ...

whay no hacer que sea mucho más fácil?

vector< complex<float> > result;
for( int i = 0; i < vA.size(); i++ ) {
    result.push_back( complex<float>( vA[i], vB[i] ) );
}

La forma más sencilla es simplemente escribir el bucle

myComplexVector cv;
for(CVFloat::iterator it1=vA.begin(), end1=vA.end(), 
      it2=vB.begin(), end2=vB.end();
    it1!=end1 && it2 != end2; ++it1, ++it2)
  cv.push_back(std::complex(*it1, *it2));

Editar: ... y seguir los consejos de Neil para declarar myComplexVector tipo adecuadamente

.

Esto no tiene ningún sentido:

typedef std::complex<CVFloat> myComplexVector;

seguramente quiere decir

typedef std::complex <float> ComplexFloat;
typedef std::vector <ComplexFloat> CFVector;

o algo similar?

Una vez ou tienen que simplemente puede iterar sobre los vectores de flotador (suponiendo que contienen valores coincidentes) y añadir a su vector complejo usando push_back ():

CFVector v;

for ( int i = 0; i < vA.size(); i++ ) {
  v.push_back( ComplexFloat( vA[i], vB[i] ) );
}

Un número complejo es simplemente un par de dos números reales a y b que denotan el complejo a+bi número. ¿Qué estás tratando de hacer con los dos vectores?

Entiendo su pregunta que usted desea combinar un vector de elementos reales con un vector de imaginaria en un vector de números complejos.

std::complex tiene un parámetro de plantilla que le permite elegir el número de represenation de las partes del complejo (es decir,si desea complejo de valores basados en la double o float o incluso algunos de número personalizado tipo...).El tipo complejo, a continuación, define básicos de álgebra compleja en términos del tipo subyacente.

En el código que usted está tratando de construir un tipo complejo basado en un vector de carrozas (es decir,un solo valor complejo tener una real y la parte imaginaria de ser un vector), que es obviamente erróneo.En cambio quieres un vector de números complejos de tipo float

Tendrías que hacer algo como:

// ...
typedef std::vector<std::complex<float> > floatComplexVector;
floatComplexVector vA_Complex; // No need to 'new' !?

for (CVFLoat::const_iterator itA = vA.begin(), itB = vB.begin(); 
     itA != vA.end() && itB != vB.end(); 
     ++itA,++itB)
  vA_Complex.push_back(std::complex<float>(*itA, *itB));

Observaciones:

  • En la mayoría de los casos no es necesario crear contenedores tales como vectores en el montón (es decir,el uso de new) Tratar de evitar esto.

  • Por desgracia, el estándar de C++ biblioteca no contienen una combinación de iterador (es decir,uno que "automáticamente" combina dos de las secuencias) que permita una solución más elegante (ver Impulsar el Zip del iterador para tener una idea general).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top