Question

J'ai deux vecteurs de flotteurs et je les veux devenir un vecteur de nombres complexes. Je suis coincé. Je ne me dérange pas l'utilisation d'itérateurs, mais je suis sûr que ce serait redécouvre la roue je ne suis pas informé de. Est-ce mon code me conduit dans la bonne direction?

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

Le code ci-dessus passe par le compilateur correctement, mais quand je veux obtenir des numéros uniques à partir myComplexVector à l'aide iterator i obtenir erreur "Undefined symbol 'const_iterator'" (Borland C ++)

myComplexVector::const_iterator it = vA_Complex->begin();
Était-ce utile?

La solution

Ici, vous créez un objet « complexe » dont les parties réelles et imaginaires sont des vecteurs de flotteurs.
Peut-être ce que vous voulez vraiment faire est de créer un vecteur d'objets complexes dont les parties réelles et imaginaires sont des flotteurs?

EDIT: myComplexVector est pas un vecteur, est un complexe. Voilà pourquoi un const_iterator car il est pas défini.

Autres conseils

Vous pouvez créer une fonction « zip » général prendre itérateurs aux deux vecteurs, et un foncteur convertisseur et un itérateur de sortie:

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

Et je souhaite qu'il y ait une telle fonction dans la STL ...

Whay pas faire beaucoup plus facile?

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

Le plus simple est juste écrire la boucle

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

Edit: ... et suivez les conseils de Neil à déclarer de type myComplexVector correctement

.

Cela ne fait aucun sens:

typedef std::complex<CVFloat> myComplexVector;

sûrement vous dire

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

ou quelque chose de similaire?

Une fois que ous avez ce que vous pouvez simplement itérer sur les vecteurs de flotteur (en supposant qu'ils contiennent des valeurs correspondantes) et ajouter à votre vecteur complexe en utilisant push_back ():

CFVector v;

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

Un nombre complexe est tout simplement une paire de deux nombres réels a et b qui désignent le nombre complexe a+bi. Qu'est-ce que vous essayez de faire avec les deux vecteurs?

Je comprends votre question que vous voulez combiner un vecteur de parties réelles avec un vecteur de parties imaginaires dans un vecteur de nombres complexes.

std::complex a un paramètre de modèle que vous permet de choisir le represenation numérique des parties du complexe (à savoir si vous voulez des valeurs complexes basées sur double ou float ou même un certain type de numéro personnalisé ...). Le type complexe définit alors l'algèbre complexe de base en termes de type sous-jacent.

Dans votre code, vous essayez de construire un type complexe basé sur un vecteur de flotteurs (à savoir à valeur complexe ayant une partie réelle et imaginaire étant un vecteur), ce qui est évidemment faux. Au lieu de cela, vous voulez un vecteur de nombres complexes de type float

Il faudrait faire quelque chose comme:

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

Remarques:

  • Dans la plupart des cas, il est nécessaire de ne pas créer des conteneurs tels que des vecteurs sur le tas (à savoir en utilisant new) Essayez d'éviter cela.

  • Malheureusement, la bibliothèque standard C ++ ne marche pas contenir un itérateur de combinaison (c.-à-un qui « automatiquement » combine deux séquences) qui permettrait une solution plus élégante (voir Boost Zip iterator pour une idée générale).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top