2010-05-19 5 views
2

J'ai Email Class, il y a le paramètre "bcc" dans son constructeur. Sa liste de courriels pour les copies. Il n'y a pas de nombre fixe de ces e-mails et plus tard je dois avoir la possibilité d'étendre cette liste. Donc, je veux utiliser le vecteur de type ou la liste pour cela et la fonction push_back(). Comment puis-je créer une nouvelle instance avec des courriels bcc?liste (vector) définition avec tableau

J'ai besoin d'une déclaration avec définition pour ma liste.

J'ai trouvé cette définition avec iterator pour le type entier:

int myints[] = {16,2,77,29}; 
Email myEmail(vector<int> (myints, myints + sizeof(myints)/sizeof(int))); 

, mais son pas très ami d'utilisateur et j'ai besoin avec des chaînes.

Y at-il quelque chose comme ça?

Email myEmail(vector<string> ("first","second","third")); 
+0

Cette question est ouverte depuis quelques semaines maintenant. Si ce n'est pas encore résolu, pourriez-vous fournir plus d'informations? – Johnsyweb

Répondre

2

Si vous avez C++ 0x, vous pouvez faire vector {"first", "second", "third"}. Sinon, vous devrez créer un nouveau vecteur dans la portée quelque part et pousser manuellement sur chacun que vous voulez, puis construire.

En outre, vous devriez vraiment prendre ce vecteur par référence, c'est vraiment assez grand.

Vous devez utiliser un vecteur std :: à moins que vous sachiez que vous devrez insérer des éléments au milieu, pas à la fin.

+0

Même si vous avez besoin d'insérer des éléments dans le stick du milieu avec un 'vector' (ou un' deque') sauf si vous l'identifiez comme un goulot d'étranglement. Pour moins de quelques dizaines d'éléments, cela fonctionnera mieux, après cela cela dépend de votre architecture. –

+0

Son programme n'est pas pour la plate-forme Intel, donc je ne peux pas utiliser toutes les fonctionnalités ou une grande bibliothèque (je n'ai pas d'espace pour cela). Je cherche une solution standard. – Meloun

3

En dehors de l'initialisation de la liste C++ 0x, il y a la bibliothèque Boost.Assign qui devrait faire la même chose.

1

Si vous n'utilisez pas C++0x, vous n'avez aucun accès aux initialisers. Pourriez-vous ajouter un constructeur qui prend une ancienne iterator, à savoir :

#include <vector> 
#include <list> 
#include <iostream> 

struct Email 
{ 
    typedef std::vector<std::string> BccType; 
    BccType m_bcc; 

    template <typename T> 
    Email(const T& iter, const T& end) 
     :m_bcc(iter, end) 
    { 
    } 

    // Purely here for illustrative purposes... 
    void display() 
    { 
     std::cerr << m_bcc.size() << " addresses..." << std::endl; 
     for (BccType::iterator iter = m_bcc.begin(), iterEnd = m_bcc.end(); iter != iterEnd; ++iter) 
     { 
      std::cerr << *iter << std::endl; 
     } 
    } 
}; 

int main(int, char*[]) 
{ 
    // Plain old char* array... 
    const char* bcc[] = {"Jeff", "Joel", "Larry", "Brin"}; 
    const size_t count = sizeof bcc/sizeof bcc[0]; 
    Email email(&bcc[0], bcc + count); 
    email.display(); 

    // STL container variation... 
    std::list<std::string> names; 
    names.push_back("Bill"); 
    names.push_back("Steve"); 
    Email reply(names.begin(), names.end()); 
    reply.display(); 
    return 0; 
} 

Il y a, bien sûr, aucune raison pour laquelle vous ne pouvez pas avoir une ctor qui prend const BccType& (typedef ed par souci de concision et maintenabilité) en plus . Notez que je suggère de passer cela par référence pour sauvegarder la copie du std::vector deux fois.