【问题标题】:Problems with vectors, how to remove the arrays in my vectors?向量的问题,如何删除我的向量中的数组?
【发布时间】:2017-12-20 14:26:44
【问题描述】:

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

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

这是我的功能:

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;
}

现在假设我有数字“1234”,这不是我想要找到的解决方案,我想从数组中删除解决方案“1234”,因为这不是解决方案......我该怎么做去做?找了好几个小时都没找到。我已经尝试过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 函数只是一个函数,所以我可以得到一个随机数,然后我进入循环,这样我就可以获取向量的元素,然后得到数组的整数。

非常感谢您花时间帮助我,非常感谢!

【问题讨论】:

  • 你可以简化你的 Gissning 函数不是吗? for (unsigned i = random-1; i

标签: c++ arrays vector erase


【解决方案1】:

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

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());

【讨论】:

  • 所以让我们看看我是否理解正确...如果我想从我的向量中删除计算机猜测,我应该使用第二个代码...但是我有一个包含四个数字的字符串,我没有了解我如何使用该代码。该字符串肯定也在我的向量中...我也遇到了一个问题,因为 Losningar 没有在一般范围内声明... losningar 仅在我创建解决方案的函数中声明
  • 重要的是第二行代码的第二行。您必须通过您的计算机猜测才能擦除
  • 无论向量的名称是什么,使用它,我只是猜到了Losningarneedle 的值是您要删除的任何值
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    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());
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2011-01-31
      • 2017-08-08
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多