Как использовать set_intersection с std :: set в VC ++? - PullRequest
5 голосов
/ 30 июня 2010

Я пытаюсь скомпилировать проект VC6 с VC10 ... Я получаю ошибку C2678 с set_intersection: я написал некоторый пример для понимания.Кто-нибудь может объяснить, как скомпилировать эти фрагменты?

#include <vector>
#include <algorithm>
#include <iostream>
#include <set>
#include <string>

int main( )
{
    using namespace std;

    typedef set<string> MyType;

    MyType in1, in2, out;
    MyType::iterator out_iter(out.begin()); 

    set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), out_iter);
}

Вывод:

c: \ program files \ microsoft visual \ studio 10.0 \ vc \ include \ алгоритма (4494): ошибка C2678: '=' двоичный файл: не определен оператор, который принимает левый операнд типа 'const std :: basic_string <_Elem, _Traits, _Ax>' (или нет приемлемого преобразования)

Если я использую std::vector вместо std::set, компиляция прошла успешно.приемлемый)

1 Ответ

6 голосов
/ 30 июня 2010

Попробуйте set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), <b>inserter(out, out.begin()) </b> );

Это потому, что set_intersection хочет выполнить запись в выходной итератор, что приводит к увеличению размера выходного контейнера.Однако это невозможно сделать только с помощью одного итератора (его можно использовать для перезаписи существующих элементов, но не для увеличения их размера)

Редактировать: исправлена ​​опечаткаИспользуйте вкладыш для добавления в набор.Back_inserter работает только для векторов и т. Д.

Редактировать 2: исправлена ​​еще одна опечатка.STL inserter требует второго аргумента, который является итератором подсказки для вероятной позиции вставки.Спасибо chepseskaf.

...