2009-10-29 6 views
4

J'utilise PHP depuis environ 4 ans, mais j'ai rencontré un problème qui nécessite quelque chose avec une légère amélioration (: P) des performances et j'ai donc choisi le C++. Le programme que j'écris est un démon Linux qui va analyser une base de données MySQL pour les URL à charger, les charger en utilisant cURL, rechercher une chaîne spécifiée, puis mettre à jour la base de données en conséquence. Le problème que je suis confronté est que je ne connais pas la taille des données qui doivent être stockées dans une variable afin d'être recherché pour une chaîne spécifique.Stocker des données de taille inconnue en C++

J'ai eu l'idée d'utiliser une liste chaînée et d'allouer plus de nœuds lorsque les données remplissaient la liste. Est-ce un bon moyen de faire les choses?

Merci à l'avance,

Répondre

6

en C++ la classe de vecteur peut stocker une quantité de données de taille inconnue.

#include <string> 
#include <vector> 

std::vector <std::string>Data; 

std::string newData = "a String"; 
Data.push_back(newData); 

std::string otherData = "a different String"; 
Data.push_back(otherData); 

bien sûr « string » pourrait être tout type de données que vous voulez, et vous pouvez accéder aux données à l'aide des données [0] pour revenir la première chaîne, et vous pouvez utiliser Data.size() pour renvoyer le quantité de chaînes dans le vecteur/tableau.

for(int x = 0; x != Data.size(); x++) 
{ 
    //Do what you want with the data here using Data[x] 
} 
+0

Vous devez utiliser des noms entièrement qualifiés ou 'using namespace std;' –

+0

Merci James, je l'éditais juste pour mettre cela :) – Sam

+0

Merci pour l'info, je vais essayer dans un peu. – Kewley

2

En général, vous voulez utiliser l'un des conteneurs standard. Ma suggestion personnelle est std::vector. Vous pouvez l'utiliser comme un tableau (car les données sont garanties contiguës) et il a des opérations d'indexation et d'insertion pratiques (il semble que vous n'êtes pas intéressé par le retrait à ce stade).

Plus précisément, vous pouvez configurer quelque chose comme

std::vector<char> buff; 
// while you are reading data 
buff.push_back (item); 

Lorsque vous avez terminé, vous pouvez appeler buff.size pour savoir combien vous lisez.

Comme bonus supplémentaire (si vous traitez en fait avec des tampons de caractères), quand vous obtenez finalement toutes les données dont vous avez besoin, vous pouvez convertir en std::string pour faire n'importe quelle recherche que vous voulez faire.

std::vector<char> buff; 
buff.push_back('e'); 
buff.push_back('a'); 
buff.push_back('t'); 

std::string s(&buff[0], buff.size()); 

Corrigé pour l'exactitude.

+0

Pour la conversion de chaîne, n'oubliez pas d'appuyer sur '\ 0'! –

+0

Dans le second extrait, il ne sortira «mange» que si vous avez de la chance. Les chaînes de style C, que le vecteur contient, doivent être terminées par un caractère nul. – UncleBens

+0

@Raphael: ou vous pourriez utiliser la chaîne de construction qui prend à la fois un char * et une taille. Quelque chose comme: 'std :: chaîne s (& buff [0], buff.size());' –

1

Vous avez beaucoup à découvrir.

Vous devez spécifiquement orienter votre découverte à la STL: utiliser C++ reference

Maintenant, vous devriez essayer d'apprendre à utiliser:

  • std::vector
  • std::string
  • std::cin et std::cout (globals)

Sur std::string vous devriez noter un bon nombre d'algorithme comme find, find_first_of, find_last_of. Notez que les manipulations de chaînes de caractères en C++ peuvent être très complexes (comme dans verbose).

Si vous êtes à l'aise avec les expressions régulières, vous pouvez essayer Boost.Regex. Notez que vous devez lier avec sa bibliothèque. En outre, si vous venez de PHP et que vous voulez augmenter vos performances, vous pouvez commencer avec beaucoup de langages de script différents (Python est mon préféré), et ce serait probablement plus facile.

+0

C/C++ est quelque chose que j'ai toujours voulu approfondir, donc j'ai pensé que je pouvais aussi bien sauter dans la partie profonde et écrire une application. Je n'ai jamais vraiment été capable d'aimer Python autant. Merci pour les conseils! – Kewley

+0

Bonne chance alors, personnellement, je m'amuse avec la langue :) –

Questions connexes