我正在尝试写解决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}}
您能帮忙发现错误并分享原因吗?
最佳答案
for ( auto set_element : output ) {
// ...
output.push_back( set_element );
在这里,您修改要迭代的 vector ,从而导致UB
可能的解决方案是制作副本
for ( auto set_element : std::vector<std::vector<T>>(output) ) {
// ...
output.push_back( set_element );
关于c++ - 意外的输出: vector 的 vector (功率集),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50520320/