De cette façon, je peux trouver le nombre d'éléments dans un tableau. Cependant, lorsque je mets ce tableau int comme modèle en tant que paramètre, le résultat n'est pas calculé correctement
class TradeList { public: int PosTicket ; strinh Pairs ; double OpenPrice ; double StopLoss ; double TakeProfit ; }
J'ajoute un tableau INT à la liste en tant que paramètre avec le modèle de type.
list<TradeList>
Et l'autre modèle et méthode créé pour imprimer ce contenu de liste
int main() { int mlArray[] = { 1,2,3,4,5}; list<int> MasterListe ; MasterListe = addList(MasterListe, mlArray); cout << "MasterListe SizeOf : " << MasterListe.size() << endl; print(MasterListe, "MasterList : "); return 0; }
template <typename T> void print(T& t, string name) { typename T::iterator i = t.begin(); cout << name << "\tMembers ==>>> "; while (i != t.end()) { if (i == t.begin()) { cout << *i++; } else { cout << " - " << *i++; } } cout << endl; }
Nombre total d'octets: 8 BytePerUnit: 4 arrSize: 2
MasterListe SizeOf: 2
MasterList: Membres == >>> 1 - 2
Le tableau est rempli de nombres 1, 2, 3, 4, 5, bien que 5 unités soient passées, la valeur de retour est 1 et 2.
Je peux également créer la liste que j'utilise actuellement dans le type INT à partir de la classe ci-dessous.
template <typename listType, typename arrayX> listType addList(listType e , arrayX array) { int sizeOf = sizeof(array); int sizeOfperOne = sizeof(array[0]); int arrSize = sizeOf / sizeOfperOne ; cout << "Total Byte : " << sizeOf << " BytePerUnit : " << sizeOfperOne << " arrSize : " << arrSize<< endl; for (int i = 0; i < arrSize; i++) { e.push_back(array[i]); } return e; }
int arr[] = {1,2,3,4,5}; int size_arr = sizeof(arr) / sizeof(arr[0]);
Croyez-moi, je n'ai pas trouvé de solution à cela grâce à mes recherches.
Je vous remercie beaucoup pour votre aide.
3 Réponses :
Je ne pense pas que ce soit une perte de temps. Gérez les opérations supplémentaires dans la méthode Main.
int main() { int mlArray[] = { 1,2,3,4,5,6,7,8,9}; list<int> SecondList; ThirdList= InsertList(SecondList, mlArray, size(mlArray)); print(SecondList, "SecondList : "); return 0; }
Méthode principale
template <typename listType, typename arrayX> listType InsertList(listType e, arrayX array, int size) { for (int i = 0; i < size; i++) { e.push_back(array[i]); } return e; }
Le tableau se désintègre en pointeurs, si vous avez besoin de la taille du tableau dans la fonction de modèle, vous pouvez changer votre fonction ci-dessous.
template <typename listType, std::size_t N, typename arrayX> listType addList(listType e , arrayX (&array)[N] ) { int sizeOf = sizeof(array); int sizeOfperOne = sizeof(array[0]); int arrSize = N; cout << "Total Byte : " << sizeOf << " BytePerUnit : " << sizeOfperOne << " arrSize : " << arrSize << endl; for (int i = 0; i < N; i++) { e.push_back(array[i]); } return e; }
Le principal problème est que les tableaux se désintègrent en pointeurs, donc les valeurs de sizeof()
dans votre fonction de modèle addList
tente en fait d'obtenir sizeof(int *)
.
Si tout ce que addList
fait est d'ajouter des éléments à la std::list
, il existe des moyens génériques de le faire sans avoir besoin de créer une autre fonction.
Une façon est d'utiliser std :: copy_n :
5
Production:
#include <iostream> #include <list> #include <algorithm> #include <iterator> #include <string> class TradeList { public: int PosTicket ; std::string Pairs ; double OpenPrice ; double StopLoss ; double TakeProfit ; }; int main() { TradeList mlArray[5]; std::list<TradeList> MasterListe; std::copy_n(mlArray, std::size(mlArray), std::inserter(MasterListe, MasterListe.end())); std::cout << MasterListe.size(); }
Selon vous, qu'est-ce qui a le plus de sens en termes de performances?
Les tableaux se désintègrent en pointeurs lorsqu'ils sont passés comme ça. Tout ce que vous avez là dans
addList
est unint *
, pas un tableau d'int
.@TedLyngmo Le code affiché semble en fait assez reproductible.
@PaulMcKenzie Est-il possible d'écrire un échantillon? Je ne veux pas me tromper à cause de la traduction anglaise.
@ cigien C'est bien. Je ne l'ai pas vu.
int mlArray [] = {1,2,3,4,5}; int * ptrArray = mlArray; list <int> MasterListe; MasterListe = addList (MasterListe, ptrArray);
C'est comme ça que je l'ai fait, mais cela ne s'est pas reproduit. listType addList (listType e, const arrayX * tableau)
Il n'est pas étrange de poser à nouveau une question.
Pourquoi avez-vous besoin d'une
addList
lorsqu'il existe un moyen générique d'ajouter des éléments à un conteneur?std::copy(ptrArray, ptrArray + sizeof(ptrArray) / sizeof(ptrArray[0]), std::inserter(MasterListe, MasterListe.end()));
.@PaulMcKenzie L'échantillon que vous avez écrit a eu le même résultat. Je ne reçois que 1 et 2 sorties. Pourquoi ai-je besoin de ça? J'ai besoin de mettre à jour une liste de transactions Forex en 5 minutes. Je n'ai pas pensé à une solution différente.
Cela devrait être:
std::copy_n(mlArray, std::size(mlArray), std::inserter(MasterListe, MasterListe.end()));
- Il n'y a pas besoin d'une fonction étrangère telle queaddList
ou un pointeurptrArray
.Ce code que vous avez écrit fonctionne. Pouvez-vous l'utiliser comme List <TradeList>? Merci beaucoup pour votre réponse.
Mettez à jour votre message d'origine afin que nous
TradeList
ce qu'estTradeList
. De plus, C ++ est sensible à la casse - voulez-vous vraiment direstd::list<TradeList>
?@PaulMcKenzie ok, mis à jour maintenant.