向量问题,如何删除向量中的数组?
Problems with vectors, how to remove the arrays in my vectors?
我创建了一个函数,可以为我正在创建的游戏创建所有可能的解决方案...也许你们中的一些人知道牛牛游戏。
首先,我创建了一个函数,用于创建最多四个整数的组合,并且该组合中不能有任何重复数字...例如...
“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
函数只是一个函数,所以我可以得到一个随机数,然后进入循环,这样我就可以获取向量的元素,然后得到数组的整数。
非常感谢您抽出时间来帮助我,万分感谢!
您需要找到要擦除的元素的位置。
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
和 erase 的两个迭代器重载。这被称为 "erase-remove" 成语。
std::array<unsigned, 4> needle{1, 2, 3, 4};
Losningar.erase(std::remove(Losningar.begin(), Losningar.end(), needle), Losningar.end());
如果你已经准备好其他功能,这个就很简单了:
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());
}
免责声明:可以提高性能(您不关心元素的顺序)。
要从向量中擦除,您只需使用擦除并为其提供一个迭代器,如下所示:
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 继续使用迭代器,您可以从擦除函数中获取 return 值,这是一个有效的迭代器,指向被擦除后的下一个元素,在这种情况下是结束迭代器。
然而,由于其内部工作方式,删除向量中间的元素效率不高。如果不同解决方案的存储顺序并不重要,那么一个小技巧可以简化并使您的代码更快。假设我们有这个。
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
我创建了一个函数,可以为我正在创建的游戏创建所有可能的解决方案...也许你们中的一些人知道牛牛游戏。
首先,我创建了一个函数,用于创建最多四个整数的组合,并且该组合中不能有任何重复数字...例如... “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
函数只是一个函数,所以我可以得到一个随机数,然后进入循环,这样我就可以获取向量的元素,然后得到数组的整数。
非常感谢您抽出时间来帮助我,万分感谢!
您需要找到要擦除的元素的位置。
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
和 erase 的两个迭代器重载。这被称为 "erase-remove" 成语。
std::array<unsigned, 4> needle{1, 2, 3, 4};
Losningar.erase(std::remove(Losningar.begin(), Losningar.end(), needle), Losningar.end());
如果你已经准备好其他功能,这个就很简单了:
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());
}
免责声明:可以提高性能(您不关心元素的顺序)。
要从向量中擦除,您只需使用擦除并为其提供一个迭代器,如下所示:
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 继续使用迭代器,您可以从擦除函数中获取 return 值,这是一个有效的迭代器,指向被擦除后的下一个元素,在这种情况下是结束迭代器。
然而,由于其内部工作方式,删除向量中间的元素效率不高。如果不同解决方案的存储顺序并不重要,那么一个小技巧可以简化并使您的代码更快。假设我们有这个。
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