Вставить элемент в std :: set с помощью конструктора - PullRequest
4 голосов
/ 09 марта 2010

возможно ли вставить новый элемент в std :: set, как в случае std :: list, например:

// вставляем один элемент с именем "string" в подсписок mylist

std::list< std::list<string> > mylist;
mylist.push_back(std::list<string>(1, "string"));

Теперь mylist имеет один элемент типа std :: string в своем подсписке типа std :: list.

Как вы можете сделать то же самое, если std :: set является подмножеством std :: list my list, т.е.

std::list<std::set <string>> mylist;

если нет, то почему бы и нет?

Ответы [ 3 ]

6 голосов
/ 09 марта 2010

Я думаю, что это должно сработать:

int main()
{
    string s = "test";
    set<string> mySet(&s, &s+1);

    cout << mySet.size() << " " << *mySet.begin();

    return 0;
}

Для уточнения законности и обоснованности обработки &s как массива см. Это обсуждение: string s; & S + 1; Правовой? UB

2 голосов
/ 09 марта 2010

std::set не имеет конструктора, который принимает элемент для вставки. Лучшее, что вы можете сделать, это использовать конструктор диапазона:

int a[] = {1,2,3,4,5};
std::set<int> foo(a, a+5);  // insert the values 1 through 5 into foo

Эта версия использует итераторы begin и end, описывающие диапазон, который будет вставлен в набор. При желании вы также можете указать критерий сортировки. Это не совсем то, что вы хотели, но это близко. Поэтому, если ваши элементы хранятся в контейнере v, вы можете вставить новый набор в свой список следующим образом:

list<set<string> > myList;
myList.push_back(set<string>(v.begin(), v.end()));
0 голосов
/ 09 марта 2010

Или в C ++ 0x:

    std::list<std::set<int>> foo;
    foo.push_back({1,2,3});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...