向量的问题,如何删除向量中的数组?

时间:2017-12-20 14:26:45

标签: c++ arrays vector erase

我创建了一个功能,可以为我正在创建的游戏创建所有可能的解决方案...也许你们中的一些人知道牛犊游戏。

首先,我创建了一个函数,该函数创建了最多四个整数的组合,并且组合中不能包含任何重复数...就像...... ' 1234'是一个解决方案,但不是' 1223'因为' 2'正在重复这个数字。在'0123'之间共有5040个数字。和' 9999'没有重复的数字。

这是我的功能:

std::vector <std::array<unsigned, 4>> HittaAllaLosningar(){
  std::vector <std::array<unsigned, 4>> Losningar;
  for (unsigned i = 0; i < 10; i++) {
    for (unsigned j = 0; j < 10; j++) {
      for (unsigned k = 0; k < 10; k++) {
        for (unsigned l = 0; l < 10; l++) {
            if (i != j && i != k && i != l && j != k && j != l && k != l) {
                Losningar.push_back({i,j,k,l});
            }
        }
      }
    }
  }
  return Losningar;
}

现在让我们说我有号码&#39; 1234&#39;这不是我想要找到的解决方案,我想删除解决方案&#39; 1234&#39;来自阵列,因为那不是一个解决方案......我该怎么做?一直试图找到几个小时,但无法找到它。我已经尝试了vector.erase,但我收到了有关unsigned和其他内容的错误...还值得提一下猜测是字符串。

我要做的是,从我的程序中获取一个字符串,如果它不是一个解决方案,我想将它从向量中移除(如果它存在于vector中)。

以下是创建猜测的代码:

std::string Gissning(){
  int random = RandomGen();
  int a = 0;
  int b = 0;
  int c = 0;
  int d = 0;

    for (unsigned i = random-1; i < random; i++) {
      for (unsigned j = 0; j < 4; j++) {
         if (j == 0) {
           a = v[i][j];
         }
         if (j == 1) {
           b = v[i][j];
         }
         if (j == 2) {
           c = v[i][j];
         }
         if (j == 3) {
           d = v[i][j];
         }
      }
      std::cout << std::endl;
      AntalTry++;
    }
std::ostringstream test;
test << a << b << c << d;
funka = test.str();

return funka;
}

randomgen函数只是一个函数,所以我可以得到一个随机数,然后我进入循环,这样我就可以获取向量的元素,然后得到数组的整数。

非常感谢您抽出宝贵时间帮助我,我非常感激!

3 个答案:

答案 0 :(得分:4)

您需要找到要擦除的元素的位置。

std::array<unsigned, 4> needle{1, 2, 3, 4};
auto it = std::find(Losningar.begin(), Losningar.end(), needle);
if (it != Losningar.end()) { Losningar.erase(it); }

如果要删除所有匹配的值,或者您不想检查end,则可以使用std::remove和擦除的两个迭代器重载。这被称为“擦除 - 删除”习语。

std::array<unsigned, 4> needle{1, 2, 3, 4};
Losningar.erase(std::remove(Losningar.begin(), Losningar.end(), needle), Losningar.end());

答案 1 :(得分:1)

如果您准备好其他功能,这很简单:

using TestNumber = std::array<unsigned, 4>;

struct TestResult {
   int bulls;
   int cows;
}

// function which is used to calculate bulls and cows for given secred and guess
TestResult TestSecretGuess(const TestNumber& secret,
                           const TestNumber& guess)
{
    // do it your self
    … … …
    return  result;
}

void RemoveNotMatchingSolutions(const TestNumber& guess, TestResult result)
{
    auto iter = 
    std::remove_if(possibleSolutions.begin(), 
                   possibleSolutions.end(),
                   [&guess, result](const TestNumber& possibility)
                   {
                       return result == TestSecretGuess(possibility, guess);
                   });
     possibleSolutions.erase(iter, possibleSolutions.end());
}

免责声明:可以提高性能(您不关心元素的顺序)。

答案 2 :(得分:1)

要从矢量中删除,您只需要使用擦除并给它一个迭代器,如下所示:

std::vector<std::array<unsigned, 4>> vec;
vec.push_back({1,2,3,4});
vec.push_back({4,3,2,1});

auto it = vec.begin(); //Get an iterator to first elements
it++; //Increment iterator, it now points at second element
it = vec.erase(it); // This erases the {4,3,2,1} array

删除元素后,它无效,因为它指向的元素已被删除。 Ti继续使用迭代器,你可以从erase函数中获取返回值,一个有效的迭代器到一个擦除后的下一个元素,在这种情况下结束迭代器。

然而,由于内部的工作方式,删除矢量中间的元素效率不高。如果不同的解决方案存储的顺序并不重要,那么一个小技巧可以简化并使您的代码更快。我们说我们有这个。

std::vector<std::array<unsigned, 4>> vec;
vec.push_back({1,2,3,4});
vec.push_back({4,3,2,1});
vec.push_back({3,2,1,4});

要删除中间的

vec[1] = vec.back(); // Replace the value we want to delete
// with the value in the last element of the vector.
vec.pop_back(); //Remove the last element