gpt4 book ai didi

c++ - std::for_each 是按值传递还是按引用传递?

转载 作者:行者123 更新时间:2023-11-30 02:53:54 25 4
gpt4 key购买 nike

我有一个带有一对 std::string 和 Person 指针的测试映射

class MyMap {
public:
void clear() {
std::for_each(people.begin(), people.end(),std::bind1st(std::mem_fun(&MyMap::remove), this));
}
void remove(std::pair<std::string, Person*> p) { delete p.second; }
private:
std::map<name, Person*> people;
};

我的问题是 for_each 是否通过引用或值传递每个 Person 对?是否值得使用我自己的,这有点清洁。

除此之外,如果我想使用 boost::bind 或 std::bind (c++11) 而不是 bind1st,我该怎么做?这个函数应该像具有继承 std::unary_function 的 operator() 的结构吗?

最佳答案

map 的类型是std::map<name, Person*> , 但 remove 的参数功能是std::pair<std::string, Person*> .这不会起作用,除非 namestd::string 的类型定义.

你的方式remove当前已定义函数,您将复制 mapvalue_type .将函数签名更改为:

void remove(std::pair<const std::string, Person *>& p)
// ^^^^^ ^
// key must be const take a reference

使用std::bind而不是 std::bind1st

std::for_each( people.begin(), 
people.end(),
std::bind( &MyMap::remove, this, std::placeholders::_1 ) );

但是如果你可以使用 C++11 特性,就不需要 std::bind , lambda 更好。

std::for_each( people.begin(), 
people.end(),
[]( decltype(*people.begin())& p ) { delete p.second; } );

或者使用基于范围的for循环

for( auto&& p : people ) {
delete p.second;
}

关于c++ - std::for_each 是按值传递还是按引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557527/

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