数组和列表的std :: set_intersection

时间:2016-08-25 08:52:17

标签: c++ arrays

我需要询问有关std :: set_intersection的问题。我已将它用于列表,如果我正在使用

,则效果很好
std::set_intersection(list1.begin(),list1.end(),list2.begin(),list2.end(), std::back_inserter(Get_intersect));

但我从未将它用于数组。如果我在这里拿阵列怎么样?我在参数中使用了数组,并希望执行交集。

std::set_intersection(a[].begin(),a[].end(),list2.begin(),list2.end(), std::back_inserter(Get_intersect));

收到此错误:syntax error : ']'。如果我从[]删除此a[],则无法开始和结束我的数组。

2 个答案:

答案 0 :(得分:0)

您可以使用std::beginstd::end

std::set_intersection(
    std::begin(a), std::end(a),
    list2.begin(), list2.end(),
    std::back_inserter(Get_intersect)
);

请注意,由于a不是一个集合,因此您需要注意它是否已排序(这是std::set_intersection工作的先决条件,请参阅set_intersection documentation

完整示例:

#include <algorithm>
#include <iostream>
#include <iterator> // for std::begin and std::end
#include <set>
#include <vector>

void printVector(std::vector<int> vec)
{
    for (std::vector<int>::const_iterator i = vec.begin(); i != vec.end(); ++i)
    {
        std::cout << *i << ' ';
    }
    std::cout << std::endl;
}

int main(int argc, char ** argv)
{
    int a[5] = { 1, 2, 3, 4, 5 };
    std::vector<int> list2;
    list2.push_back(2);
    list2.push_back(4);
    std::vector<int> intersection;
    std::set_intersection(
        std::begin(a), std::end(a),
        list2.begin(), list2.end(),
        std::back_inserter(intersection)
    );
    printVector(intersection);
}

答案 1 :(得分:0)

如果你有一个实际的数组(而不是指针),那么你可以使用std::beginstd::end来获得#34;迭代器&#34;对于阵列。

那些基本上做的是给你指针到开头和结尾(加一)。如果你有大小的话,你实际上可以自己传递指针:

int* pointer_to_array = ...;
size_t num_elements = ...;

some_function_taking_iterators(
    pointer_to_array,    // This is the begin "iterator"
    pointer_to_array + num_elements  // This is the end "iterator"
);