Trouver toutes les occurrences d'un caractère dans une chaîne
J'ai délimité par des virgules cordes j'ai besoin de tirer les valeurs de. Le problème est que ces chaînes ne seront jamais une taille fixe. J'ai donc décidé de faire une itération sur les groupes de virgules et de lire ce qui est entre les deux. Pour ce faire j'ai fait une fonction qui retourne chaque occurrence de la position dans un exemple de chaîne.
Est-ce une façon intelligente de le faire? Est-ce considéré comme un mauvais code?
#include <string>
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;
vector<int> findLocation(string sample, char findIt);
int main()
{
string test = "19,,112456.0,a,34656";
char findIt = ',';
vector<int> results = findLocation(test,findIt);
return 0;
}
vector<int> findLocation(string sample, char findIt)
{
vector<int> characterLocations;
for(int i =0; i < sample.size(); i++)
if(sample[i] == findIt)
characterLocations.push_back(sample[i]);
return characterLocations;
}
Pour moi c'est parfait. Bien qu'il y aura beaucoup de C++ codeurs en disant: "pourquoi inventer la roue" et "utiliser cette fonction, ne pas l'écrire vous-même". De toute façon, je ne m'inquiète pas, je ne sais pas à propos de vous. Cependant, il y a un petit problème avec votre code.
Ouais je viens de fixe. Aussi, il devait être .size() pas de longueur
Si vous allez diviser les cordes par la suite, vous voudrez peut-être jeter un coup d'oeil à question.
Vous venez de prouver le point de ne pas "réinventer la roue". Pourquoi prendre le risque d'introduire un bug dans votre système lorsqu'une solution est disponible qui a eu des bugs pressé de lui pendant des années.
i
ne devrait pas atteindre sample.length()
, vous devriez donc avoir i < sample.length()
dans votre pour la condition de boucleOuais je viens de fixe. Aussi, il devait être .size() pas de longueur
Si vous allez diviser les cordes par la suite, vous voudrez peut-être jeter un coup d'oeil à question.
Vous venez de prouver le point de ne pas "réinventer la roue". Pourquoi prendre le risque d'introduire un bug dans votre système lorsqu'une solution est disponible qui a eu des bugs pressé de lui pendant des années.
OriginalL'auteur lodkkx | 2011-10-11
Vous devez vous connecter pour publier un commentaire.
Tel qu'il est actuellement rédigé, ce sera tout simplement retourner un vecteur contenant les int des représentations des caractères eux-mêmes, et non pas leurs positions, qui est ce que vous voulez vraiment, si j'ai lu votre question correctement.
Remplacer cette ligne:
avec cette ligne:
Et qui devrait vous donner le vecteur que vous voulez.
S'il vous plaît changer la ligne du haut de vector<int> findLocation(const string& de l'échantillon, char findIt). Nous ne voulons pas copier les chaînes
OriginalL'auteur jwfriese
Si je passais en revue ce, je voudrais la voir, et supposer que ce que vous êtes vraiment essayer de faire est de marquer une chaîne de caractères, et il y a déjà de bonnes façons de le faire.
Meilleure façon que j'ai vu faire c'est avec
boost::tokenizer
. Il vous permet de spécifier la façon dont la chaîne est délimitée et puis vous donne une belle interface iterator pour parcourir chaque valeur.De sortie:
Modifier Si vous ne voulez pas d'une dépendance sur un coup de pouce, vous pouvez également utiliser
getline
avec unistringstream
comme dans cette réponse. Pour copier un peu de cette réponse:De sortie:
Cela peut ne pas être directement ce que vous demandez, mais je pense qu'il obtient à l'ensemble de votre problème que vous essayez de résoudre.
myTkoens
devrait êtremyTokens
.>>
devrait être> >
(à moins que l'OP est à l'aide de C++11). Je ne peux pas tester ce code, mais savez-vous comment sont deux consécutifs ou plus, le séparateur de caractères traités?Essentiellement, j'ai besoin de deux valeurs d'un 12 de l'élément de csv chaîne. Ne serait-il pas plus facile à utiliser ma fonction et seulement affecter les chaînes de caractères de la chaîne de l'index de ma fonction retourne?
Il suffit de regarder ces deux morceaux de code et osez me dire boost ressemble mieux!!!!
vous avez peut-être raison 🙂
OriginalL'auteur Doug T.
Semble bon pour moi aussi, un commentaire est avec le nommage de vos variables et types. Vous appelez le vecteur vous allez revenir
characterLocations
qui est de typeint
si vraiment vous êtes à repousser le personnage lui-même (qui est de typechar
) pas de son emplacement. Je ne suis pas sûr de ce que la plus grande de demande est fait pour, mais je pense qu'il serait plus logique de passer de nouveau les lieux. Ou faire un plus de coupeur de biscuit chaîne de marquer.OriginalL'auteur Jordan
Comment smart il dépend aussi de ce que vous faites avec ces subtstrings délimité par des virgules. Dans certains cas, il peut être mieux (par exemple, plus vite, avec moins de mémoire) pour éviter la recherche et du fractionnement et de la juste analyser et processus de la chaîne en même temps, peut-être à l'aide d'une machine d'état.
OriginalL'auteur Alexey Frunze
Eh bien, si votre but est de trouver les indices d'occurrences le code suivant sera plus efficace qu'en c++ donner des objets comme paramètres les causes les objets à copier ce qui est dangereux et également moins efficace. Surtout le retour d'un vecteur est la pire pratique possible, dans ce cas, c'est pourquoi le donner comme un argument de référence sera beaucoup mieux.
En fait, dans ce cas, retourner le vecteur n'est pas que mauvais, car le rendement de la valeur de l'optimisation permettra d'optimiser loin (ce qui est potentiellement coûteux) copie. Cependant, la STL de façon serait d'écrire les résultats d'une sortie itérateur dont le type est un modèle à paramètre. Ainsi, l'utilisateur de la fonction peut choisir la représentation qu'il veut des résultats.
Chers chronoz, en c++, les variables locales sont initiées à partir de stackspace. quand une fonction se termine, son stackspace est en train d'être détruit (dans le cas characterLocations), pour cette raison, c++ renvoie une copie de la valeur retournée si la variable restera valide. Dans ce cas, le compilateur peut (ou pas selon les options de compilation) copiez tous les vecteurs qui, évidemment, ralentit votre solution vers le bas. Chers Bjorn Phalanges, vous avez raison (surtout stl façon est vraiment un bon moyen pour ce problème), mais à mon avis, il est préférable de ne pas compter sur le comportement du compilateur, mais pour votre propre code.
OriginalL'auteur hevi