определение списка (вектора) с массивом - PullRequest
2 голосов
/ 19 мая 2010

У меня есть электронная почта класса, в ее конструкторе есть параметр "bcc". Это на самом деле список писем для копий. Не существует фиксированного количества этих писем, и позже я должен иметь возможность расширить этот список.

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

Так что я хочу использовать вектор типа или список для этого и функцию push_back (). Как я могу создать новый экземпляр с письмами bcc?

Мне нужно объявление с определением для моего списка.

Я нашел это определение с итератором для целочисленного типа:

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

, но это не очень друг, и он мне нужен со строками.

Есть что-нибудь подобное?

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

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

Помимо инициализации списка C ++ 0x, есть библиотека Boost.Assign , которая должна делать подобные вещи.

2 голосов
/ 19 мая 2010

Если у вас есть C ++ 0x, вы можете сделать vector {"first", "second", "third"}. Иначе, вам придется где-то создать новый вектор в области видимости и вручную нажать на каждый, который вы хотите, а затем создать.

Кроме того, вы должны действительно взять этот вектор по ссылке, он действительно довольно большой.

Вы должны использовать std :: vector, если вы не знаете, что вам нужно будет вставлять элементы в середину, а не в конец.

1 голос
/ 26 мая 2010

Если вы не используете C++0x, то у вас нет доступа к инициализаторам. Не могли бы вы добавить конструктор, который принимает любой старый итератор, viz :

#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 ed для краткости и удобства обслуживания). Обратите внимание, что я предлагаю передать это по ссылке, чтобы сохранить копирование std::vector дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...