c++ - 使用 for_each 和 bind 反转 vector 中的字符串

标签 c++ stl vector tr1 stl-algorithm

我在想如何在一个“简单的"行。

是的,我知道使用自定义仿函数很容易,但我不能接受,它不能使用 bind 完成(至少我做不到)。

#include <vector>
#include <string>
#include <algorithm>

std::vector<std::string> v; 
v.push_back("abc");
v.push_back("12345");

std::for_each(v.begin(), v.end(), /*call std::reverse for each element*/);

编辑: 非常感谢那些有趣的解决方案。 但是,我的解决方案是不使用 tr1::bind随 Visual Studio 2008 功能包/SP1 一起提供。我不知道为什么它不能像预期的那样工作,但事实就是如此(even MS admits that it's buggy)。也许一些hotfixes会有帮助。

有了 boost::bind,一切都按预期工作,而且非常简单(但有时真的很乱:))。我真的应该首先尝试 boost::bind ......

最佳答案

std::for_each 需要一个一元函数(或者至少是具有一元函数类型定义的东西)。

std::reverse<> 是一个二元函数。它需要两个迭代器。可以使用 boost::bind 将它们全部绑定(bind)在一起,但这将是一个非常可怕的困惑。像这样的东西:

boost::bind(
    &std::reverse<std::string::iterator>,
        boost::bind(&std::string::begin, _1), 
        boost::bind(&std::string::end, _1))

我认为,更好的做法是编写一个名为 reverse_range 的可重用函数,如下所示:

template <class Range>
void reverse_range(Range& range)
{
    std::reverse(range.begin(), range.end());
}

(可能使用一些元编程来确保 Range& 不是双重引用)

然后在您的 for_each 中使用它(当然是在将其调整为一元函数之后)。

std::for_each(v.begin(), v.end(),
    std::ptr_fun(&reverse_range<std::string>));

编辑:

因为 string::begin 和 string::end 都有 const 和非常量变体,所以有必要转换它们(正如 litb 在我写它们以测试我的答案时发现的那样......+1!)。这使得它非常冗长。 Typedef 可以使它更卫生一点,但要坚持单行主题:

boost::bind(
    &std::reverse<std::string::iterator>,
    boost::bind(
        (std::string::iterator (std::string::*)())&std::string::begin, _1),
    boost::bind(
        (std::string::iterator (std::string::*)())&std::string::end, _1)
    )
);

这只是为重构尖叫。

最后,因为无聊,给C++0x加分:

std::for_each(v.begin(), v.end() [](std::string& s){ std::reverse(s); });

编辑:boost::bind 工作正常,不需要 boost::lambda。

关于c++ - 使用 for_each 和 bind 反转 vector 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497063/

相关文章:

c++ - 如果我想为自定义类型使用 tr1 无序映射,如何避免在我的 header 中使用哈希函数 impl?

c++ - Windows 上的进程资源限制

c++ - 将迭代器转换为指针?

c++ - 如何在c++中删除 vector 中的空格

c++ - 一个 System v 消息队列用于多进程读/写的问题

c++ - 我应该在哪里为我的 std::pair 特化定义运算符 >>?

R排列向量列表

java - Lotus Notes 的 Java API 中的方法返回 Vector 而不是 ArrayList

c++ - 如何在虚幻蓝图中创建等效的 Unity LookAt?

c++ - 在 Windows 上的目录上使用 fopen