2016-05-19 1 views
-2

A écrit l'extrait de code suivant pour trouver le nombre d'octets de mémoire supplémentaires que chaque chaîne ajoutera à la chaîne.Augmenter la capacité d'une chaîne

#include <iostream> 
#include <string> 
#include <unordered_map> 
#include <sys/time.h> 
#include <arpa/inet.h> 

using namespace std; 
typedef unsigned short uint16; 
typedef unsigned int uint; 



int main (int argc, char *argv[]) { 
    const char *p = NULL; 
    string s = ""; 
    for (int i=0; i<1050; i++) { 
     s += "a"; 
     if (s.c_str() != p) { 
      printf("%5d\n", i); 
      p = s.c_str(); 
     } 
    } 
    return 0; 
} 

La sortie est

0 
    1 
    2 
    4 
    8 
    16 
    32 
    64 
    128 
    256 
    512 
1024 

Ainsi, le résultat tout à fait, il montre clairement doubles depots de la chaîne à chaque fois (au minimum). La question est, comment ajouter l'espace spécifié d'utilisation (par exemple, 2000 octets) à une chaîne existante de sorte que l'on puisse faire beaucoup de chaîne append sans déclencher un libre/malloc.

Merci.

+2

[Utilisez 'std :: basic_string :: reserve'] (http://fr.cppreference.com/w/cpp/string/basic_string/reserve) – Rakete1111

+0

@ Rakete1111: Utilisez la section des réponses. –

+0

@ LightnessRacesinOrbit ok, je vais :) – Rakete1111

Répondre

3

Vous pouvez faire cela en utilisant la fonction membre reserve(). Notez qu'il ne peut pas allouer la quantité exacte de stockage que vous demandez (vous pouvez obtenir plus), mais vous obtiendrez au moins ce que vous demandez en une seule allocation.

2

Lisez la documentation!

C'est ce que std::string::reserve est pour.

+0

Je vais vous donner cela et se rétracter. Un websearch simple couvrira si le lien devient indisponible. – user4581301

+0

Merci, négligé cette méthode. J'aimerais pouvoir accepter votre réponse aussi. – packetie