Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从std::vector中删除对象?_Vector_C++ Standard Library - Fatal编程技术网

如何从std::vector中删除对象?

如何从std::vector中删除对象?,vector,c++-standard-library,Vector,C++ Standard Library,全部, 考虑以下代码: class CPlayer { public: CPlayer(bool new) { m_new = new; }; bool IsNewPlayer() { return m_new; } private: bool m_new; }; int main() { std::vector<CPlayer> players_pool; players_pool.push_back( false ); playe

全部,

考虑以下代码:

class CPlayer
{
public:
    CPlayer(bool new) { m_new = new; };
    bool IsNewPlayer() { return m_new; }
private:
    bool m_new;
};

int main()
{
    std::vector<CPlayer> players_pool;
    players_pool.push_back( false );
    players_pool.push_back( false );
    players_pool.push_back( true );
    players_pool.push_back( false );
}
现在给出的例子都是简单整数,而不是类对象

有没有一个简单的方法来执行这样的操作

我需要它在MSVC 2010和带有10.6 SDK的XCode 4中工作

注意:给出的代码是我正在处理的实际代码的简化版本。类CPlayer的字段比我在这里放的要多得多,但它们与本文无关

多谢各位

附言:我发现了,但我的问题是它是否能在OSX上工作。我的卸妆液如下所示:

players_pool.erase( std::remove( players_pool.begin(), players_pool.end(), players_pool.at().IsNewPlayer() ), players_pool.end() );
struct Remover : public std::binary_function<CPlayer,void,bool>
{
public:
    bool operator()(const CPlayer &player) const
    {
        return player.IsNewPlayer();
    }
};
struct-Remover:public-std::binary\u函数
{
公众:
布尔运算符()(常量CPlayer和player)常量
{
return player.IsNewPlayer();
}
};

是的,这是可能的。标准库提供了
std::remove
,用于删除与某个指定值相等的对象(使用
=
运算符),如果
std::remove\u
,则该库具有
std::remove\u,而不是一个值,它接受对对象调用的函数,如果返回
true
,它表示应删除该对象。因此,只需编写一个定义所需条件的函数,并使用该函数:

players_pool.erase( std::remove_if(
  players_pool.begin(),
  players_pool.end(),
 [](const CPlayer& p){ return p.IsNewPlayer(); }),
 players_pool.end() );

注意,对于传递给
remove\u if
的函数,我使用了lambda。如果您的编译器还不支持该功能,您可以简单地单独定义该函数,或者将其定义为一个函数(带有签名
bool func(const CPlayer&);
,或者一个带有
bool操作符()的函数对象(const CPlayer&)

是的,这是可能的。标准库提供了
std::remove
,它删除等于某个指定值的对象(使用
=
操作符),它有
std::remove_if
,它不是一个值,而是接受一个在对象上调用的函数,如果它返回
true
,则表示应该删除该对象。因此,只需编写一个定义所需条件的函数,并使用该函数:

players_pool.erase( std::remove_if(
  players_pool.begin(),
  players_pool.end(),
 [](const CPlayer& p){ return p.IsNewPlayer(); }),
 players_pool.end() );

注意,我对传递给
remove\u if
的函数使用了lambda。如果您的编译器还不支持该函数,您可以单独定义该函数,或者将其定义为一个函数(带有签名
bool func(const CPlayer&);
,或者一个带有
bool操作符()的函数对象(const CPlayer&)

只需使用
std::remove\u if
和lambda函数作为谓词:

players.erase( std::remove_if( players.begin() , 
                               players.end() , 
                               [](const Player& player) { return player.IsNewPlayer(); } 
                              ) );

在XCode中您使用的是叮当声吗


另一方面,如果编译器不支持C++11 lambda,则函子是正确的方法。

只需使用
std::remove\u if
和lambda函数作为谓词:

players.erase( std::remove_if( players.begin() , 
                               players.end() , 
                               [](const Player& player) { return player.IsNewPlayer(); } 
                              ) );

在XCode中您使用的是叮当声吗



P>另一方面,如果编译器不支持C++ 11 lambdas,则你的函子是正确的。

小心:<代码>新< /Cord>是C++中的关键字。你不能用它作为标识符。@ MAN33637,是的,我就是。这就是为什么我在帖子中写了“注释”。关于问题:我不完全理解你的意思,但是<代码> vector < /C>是一个通用模板,删除擦除习惯用法适用于任何初始化的数据类型。析构函数将被正确调用。顺便说一下,这是不相关的,这既不涉及XCODER也不涉及VisualStudio。这是一个关于C++语言的问题。和标准库。(再次,它不是STL。STL是完全不同的。)Currul: <代码> NeX/Cord>是C++中的关键字。不能使用它作为标识符。@ MUN33637,是的,我是。这就是为什么我在帖子中写“注释”;-):我不完全明白你的意思。但是
vector
是一个通用模板,remove-erase习惯用法适用于初始化它的任何数据类型。析构函数将被正确调用。@Manu343726顺便说一下,这与Xcode和Visual Studio都没有关系。这是一个关于C++语言和标准库的问题。(这也不是STL,STL是完全不同的。)哪个XCode/SDK开始支持lambda表达式?我不确定10.6是否支持它们,但我不能确定它是否支持这样的functor(意思是std::bind2nd)。Xcode4.4使用LLVM4.0,其中包括lambdas:如何调用我的functor?“std::bind2nd(Remover())”给出编译器错误“预期2个参数-提供一个”。谢谢。您希望使用一元函数,因为您只需要一个获取播放器并返回布尔值的函数(检查
std::find_if
文档。谓词的签名非常清楚)。您正在使用一个二进制函子。您的
操作符()
很好,但函子的类型不是。使用
std::一元函数
代替:@Igor或不使用任何东西<代码>std::一元函数
不是必需的,事实上在C++11中不推荐使用。哪个XCode/SDK开始支持lambda表达式?我不确定10.6是否支持它们,但我不能确定它是否支持这样的functor(意思是std::bind2nd)。Xcode4.4使用LLVM4.0,其中包括lambdas:如何调用我的functor?“std::bind2nd(Remover())”给出编译器错误“预期2个参数-提供一个”。谢谢。您希望使用一元函数,因为您只需要一个获取播放器并返回布尔值的函数(检查
std::find_if
文档。谓词的签名非常清楚)。您正在使用一个二进制函子。您的
操作符()
很好,但函子的类型不是。使用
std::一元函数
代替:@Igor或不使用任何东西<代码>std::一元函数不是必需的,事实上在C++11中已被弃用。@yalf,XCode和10.6 SDK是否支持它?@Igor我不知道,但请检查我的更新:)您不需要使用lambda表达式,我只是用它来简化我的操作example@yalf,它会被XCode和10.6SDK支持吗?@Igor我不知道,但是检查我的更新:)您不需要使用lambda表达式,我只是用它来简化我的示例