C++ 从平方向量中按值而不是按位置删除元素

C++ 从平方向量中按值而不是按位置删除元素,c++,sudoku,C++,Sudoku,作为数独游戏板实现的一部分,每个方块都有一组可能的值,以及一个行号和列号 我是通过一个带有一组可能值的平方向量来实现的,其中某些值将从可能值集中删除,遵守数独规则(例如在相同的x和y值中,或在相同的子正方形中) 我遇到的问题是,我不知道如何从集合中删除特定值,我将其设置为: vector< vector< std::set <int> > > gameboard; 但我很确定这只是去除向量中任何位置的值,这不是我想要的。有什么想法吗?从集合中删除值的语法看

作为数独游戏板实现的一部分,每个方块都有一组可能的值,以及一个行号和列号

我是通过一个带有一组可能值的平方向量来实现的,其中某些值将从可能值集中删除,遵守数独规则(例如在相同的x和y值中,或在相同的子正方形中)

我遇到的问题是,我不知道如何从集合中删除特定值,我将其设置为:

 vector< vector< std::set <int> > > gameboard;

但我很确定这只是去除向量中任何位置的值,这不是我想要的。有什么想法吗?

从集合中删除值的语法看起来不错。然而,我认为你没有得到正确的价值

int removeValue = *gameboard[3][3].begin();

std::set<int> &rSquare = gameboard[3][3];       // get the set
std::set<int>::iterator iter = rSquare.begin(); // get an iterator
int first_possibility = *iter;                  // retrieve first possibility in set
下面是创建9x9网格、初始化所有可能性,然后删除特定可能性的完整工作演示:

#include <iostream>
#include <vector>
#include <set>

std::set<int> initialize_square(){
    std::set<int> all;
    for (int value = 1; value <= 9; ++value)
        all.insert(value);
    return all;
}

int main()
{
    std::vector< std::vector< std::set <int> > > gameboard;
    gameboard.resize(9);
    for (int x = 0; x < 9; ++x){
        gameboard[x].resize(9);
        for (int y = 0; y < 9; ++y){
            gameboard[x][y] = initialize_square();
        }
    }

    std::set<int> &possibilities = gameboard[3][3];

    std::cout << "possibilities before removing '5' are: ";
    for (int n : possibilities)
        std::cout << n << ", ";
    std::cout << std::endl;

    // remove 5 from a specific cell
    // I would use possibilities.erase but this proves your syntax was good
    int value_to_remove = 5;
    gameboard[3][3].erase(value_to_remove);

    std::cout << "possibilities after removing '5' are: ";
    for (int n : possibilities)
        std::cout << n << ", ";
    std::cout << std::endl;
}
#包括
#包括
#包括
std::set initialize_square(){
std::设置全部;
对于(int值=1;值>游戏板;
游戏板。调整大小(9);
对于(int x=0;x<9;++x){
游戏板[x]。调整大小(9);
对于(int y=0;y<9;++y){
gameboard[x][y]=初始化_square();
}
}
std::set&posabilities=gameboard[3][3];

std::cout-Yup。您不再有一个正方形。建议使用一个不可能的值作为您可以设置和测试的哨兵。我知道您从未打算遍历该集合,但由于您正在对迭代器进行解frenching,如果该集合的begin()==end(),您可以得到UB。
gameboard[x][y].erase(removeValue);
#include <iostream>
#include <vector>
#include <set>

std::set<int> initialize_square(){
    std::set<int> all;
    for (int value = 1; value <= 9; ++value)
        all.insert(value);
    return all;
}

int main()
{
    std::vector< std::vector< std::set <int> > > gameboard;
    gameboard.resize(9);
    for (int x = 0; x < 9; ++x){
        gameboard[x].resize(9);
        for (int y = 0; y < 9; ++y){
            gameboard[x][y] = initialize_square();
        }
    }

    std::set<int> &possibilities = gameboard[3][3];

    std::cout << "possibilities before removing '5' are: ";
    for (int n : possibilities)
        std::cout << n << ", ";
    std::cout << std::endl;

    // remove 5 from a specific cell
    // I would use possibilities.erase but this proves your syntax was good
    int value_to_remove = 5;
    gameboard[3][3].erase(value_to_remove);

    std::cout << "possibilities after removing '5' are: ";
    for (int n : possibilities)
        std::cout << n << ", ";
    std::cout << std::endl;
}