gpt4 book ai didi

c++ - 将对象移到 vector C++的前面

转载 作者:行者123 更新时间:2023-12-02 10:37:05 25 4
gpt4 key购买 nike

我有一个vector<Suggestions> finalSuggestions,其中包含string word和一些int num

如果这个词满足某些条件,我想将该对象移到 vector 的前面,将其从任何位置移开。

我可以使用vector::insert插入列表的开头

for (auto &x: finalSuggestions) {
if ( double((x.num)/(topword.num)) < 50)
{
finalSuggestions.insert(finalSuggestions.begin(),x);
break;
}
}

但是 我不知道如何从列表中的位置删除它。

例如,对于某些任意 vector { 1,2,3,4,50,6,7,8,9 }
如果50满足条件,则将其移到列表的最前面,并从原来的位置将其删除,并返回 { 50,1,2,3,4,6,7,8,9 }。上面的代码返回 { 50,1,2,3,4,50,6,7,8,9 }
我一直在研究 vector::erase,但是遇到了问题,而且花费的时间比应该的长。

我设想了一个简单的解决方案(但这显然行不通)
for (auto &x: finalSuggestions) {
if ( double((x.num)/(topword.num)) < 50)
{
finalSuggestions.insert(finalSuggestions.begin(),x);
finalSuggestions.erase(x);
break;
}
}

我阅读了有关删除删除的习惯用法(这是我的实现):
 finalSuggestions.erase( remove( begin(finalSuggestions), end(finalSuggestions), x ), end(finalSuggestions) ); 

但收到一个我不明白的错误:
In instantiation of '_FIter std::remove(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<Suggestion*, std::vector<Suggestion> >; _Tp = Suggestion]':|

最佳答案

对于vector::erase,您需要一个迭代器,因此不能使用基于范围的for。请改用简单的for循环。首先删除一个元素,然后将其插入,因为insert使迭代器无效:

for (auto it = finalSuggestions.begin(); it != finalSuggestions.end(); ++it) {
if (some_condition(*it)) {
auto x = *it; // or std::move(*it)
finalSuggestions.erase(it);
finalSuggestions.insert(finalSuggestions.begin(), x /* or std::move(x) */);
break;
}
}

使用 std::move将使您可以移动元素而不是复制元素,这可以节省一些周期。

关于c++ - 将对象移到 vector C++的前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827450/

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