意外输出:矢量矢量(功率设定)

时间:2018-05-25 01:40:11

标签: c++ vector push-back powerset

我正在尝试为CTCI的一个问题编写解决方案 - 编写一个方法来返回一组的所有子集。但是,我没有得到预期的输出。似乎有一个愚蠢的错误,但我无法发现它。以下是代码:

template <typename T>
std::vector<std::vector<T>> power_set( const std::vector<T>& input ) {
    std::vector<std::vector<T>> output;
    for ( const auto& element : input ) {
        power_set_helper( element, output );
    }
    return output;
}

template <typename T>
void power_set_helper( const T& element, std::vector<std::vector<T>>& output ) {
    for ( auto set_element : output ) {
        set_element.push_back( element );
        output.push_back( set_element );
    }
    output.emplace_back( std::initializer_list<T>{element} );
}

测试案例:

std::vector<int> input                       = {1, 2, 3};
std::vector<std::vector<int>> expected_ouput = {{1}, {1, 2}, {2}, {1, 3}, {1, 2, 3}, {2, 3}, {3}};

但我得到的输出是:     {{1},{1,2},{2},{1,3},{1,2,3},{3},{3}}

你能帮忙发现错误并分享原因吗?

1 个答案:

答案 0 :(得分:1)

for ( auto set_element : output ) {
    // ...
    output.push_back( set_element );

在这里修改迭代的向量,导致UB

可能的解决方案是制作副本

for ( auto set_element : std::vector<std::vector<T>>(output) ) {
    // ...
    output.push_back( set_element );