2010-05-19 113 views
2

我有类电子邮件, 在她的构造函数中有参数“密件抄送”。 它的副本邮件的实际列表。 这些电子邮件没有固定的数量,后来我必须有可能扩展这个列表。列表(矢量)定义与数组

//constructor prototype 
Email::Email(vector<string> bcc) 

所以我想使用类型向量或列表的功能push_back()。 如何创建一个密件抄送电子邮件的新实例?

我实际上需要定义我的清单声明。

我发现这个定义与迭代器整数类型:

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

,但它不是非常用户的朋友,我需要它使用字符串。

有没有这样的事情?

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

此问题已打开几个星期。如果还没有解决,你能提供更多的信息吗? – Johnsyweb 2010-06-13 22:32:33

回答

2

如果你有C++ 0x,你可以做vector {“first”,“second”,“third”}。否则,你将不得不在某个地方创建一个新的向量,并手动推动你想要的每个向量,然后构造。

另外,你应该通过引用真正把这个向量,它真的很大。

你应该使用std :: vector,除非你知道你需要插入项目到中间,而不是结束。

+0

即使您需要用“vector”(或“deque”)插入物品,除非您将其识别为瓶颈。对于不到几十个元素,它会表现得更好,然后取决于你的架构。 – 2010-05-19 16:57:07

+0

它不是intel平台的程序,所以我不能使用任何功能或大型图书馆(我没有空间)。我寻找一个标准的解决方案。 – Meloun 2010-05-19 16:58:32

1

如果你不使用C++0x那么你无法访问初始化程序。你可以添加一个构造函数任何旧的迭代器,

#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; 
} 

有,当然,没有理由你不能有一个ctor这需要const BccType&typedef编辑为简洁性和可维护性)还。请注意,我建议通过此参考保存复制std::vector两次。