gpt4 book ai didi

c++ - 按 vector 对中的索引删除元素

转载 作者:太空狗 更新时间:2023-10-29 21:14:07 28 4
gpt4 key购买 nike

我在第一个和第二个位置都有整数 vector 对,输入非常具体。
首先,我有 i 个输入,它们都进入 vector 的第一个位置,但之后是第二个输入数组,它应该进入第二个位置。
然而,我想做的是,如果我发现第二个点的输入大于某个值(mana,在我的例子中是变量),我会喜欢简单地不将它放入 vector 对中,并从第一个位置删除该索引上的第一个元素,我很难弄清楚如何对其进行编码。这是该代码的一部分:

vector<pair<int, int>>spellOne;

for (int i = 0; i < nSpellOne; i++)
{
scanf_s("%d", &input);
spellOne.back().first = input;
}

for (int i = 0; i < nSpellOne; i++)
{
scanf_s("%d", &input);

if (input > mana)
{
// removing the element on .first position at i index
}
else
{
spellOne.at(i).second = input;
}
}

任何人都可以帮助我了解如何做到这一点,如果可能的话,或者我应该切换到不同类型的数组吗?我也考虑过使用 map ,但那是不可能的,因为我很有可能在 vector 的第一个/第二个位置两次获得相同的值,因此我不能将它们中的任何一个用作键。

最佳答案

我举了一个例子,它应该能激励你完成你的任务。在下面的示例中,我填充了 vector ,然后删除第二个值大于特定阈值(在本例中为 2)的对。

现在您可以使用两个变量来跟踪删除元素的循环,一个循环遍历整个 vector ,一个跟踪当前要检查的索引;如果我们删除 v[3],那么下一个元素 v[4] 将被移动(因为我们调用了 erase())代替v[3],因此我们应该再次检查索引 3!

#include <iostream>
#include <utility>
#include <vector>

using namespace std;


int main()
{
vector< pair<int, int> > v;
int N = 5;
const int threshold = 2;
for(int i = 0; i < N; ++i)
v.push_back(make_pair(i, i));

int i = 0;
while(i < v.size())
if (v[i].second > threshold)
v.erase(v.begin() + i);
else
i++;

for(int i = 0; i < v.size(); ++i)
cout << "(" << v[i].first << ", " << v[i].second << ")\n";

cout << "Done" << endl;
}

输出:

(0, 0)
(1, 1)
(2, 2)
Done

编辑你的评论:你可以试试看:

int i = 0;
while(i < nSpellOne.size())
{
scanf_s("%d", &input);
if (input > mana)
nSpellOne.erase(nSpellOne.begin() + i);
else
i++;
}

PS - 在编写高效代码时,不要为 std::cinscanf() 哪个更快而烦恼,专注于您的算法!

关于c++ - 按 vector 对中的索引删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706118/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com