3
    typedef std::vector<std::string> TVector;
    TVector a_list;

    populate vector...
    for_each(a_list.begin(),a_list.end(),std::toupper);

错误

no matching function for call to 'for_each(std::vector<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >::iterator, <unresolved overloaded function type>)

我是否需要使用标准 for 循环遍历元素?还是有另一种方式我不允许使用 c++ 11 功能。

谢谢

4

3 回答 3

4

toupper函数用于字符,而不是字符串。它还返回大写字符,因此不能与 . 一起使用for_each,但可以与. 一起使用std::transform。还有std::toupper两个重载中存在的问题,编译器无法决定使用哪一个。包括<cctype>并使用plain toupper(或可选::toupper)来获得正确的功能。

您需要先遍历向量中的所有字符串,然后再遍历字符串以调用toupper.

您可以手动完成,也可以使用transform和使用仿函数对象,例如

struct strtoupper
{
    std::string operator()(const std::string& str) const
    {
        std::string upper;
        std::transform(str.begin(), str.end(), std::back_inserter(upper), ::toupper);
        return upper;
    }
};

// ...

std::transform(a_list.begin(), a_list.end(), a_list.begin(), strtoupper());
于 2013-05-29T09:32:19.430 回答
3

你有一个向量std::string并且std::toupper期望一个char作为参数。所以不能使用。你可以做的是:

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

于 2013-05-29T09:32:33.077 回答
2

std::toupper是一个重载函数;这就是您收到<unresolved overloaded function type>错误消息的原因。要选择特定的重载,您需要强制转换它:

static_cast<int(*)(int)>(std::toupper)

for_each也不是这个任务的正确选择——它将调用toupper列表中的每个字符串,然后丢弃结果。std::transform将是合适的选择——它将其输出写入输出迭代器。但是,toupper适用于字符,而不是字符串。您仍然可以使用transform来调用toupper字符串中的每个字符:

std::transform(
    a_string.begin(),
    a_string.end(),
    a_string.begin(),
    static_cast<int(*)(int)>(std::toupper)
);

在这种简单的情况下使用循环可能会更清楚:

for (TVector::iterator i = a_list.begin(), end = a_list.end(); i != end; ++i) {
    for (std::string::size_type j = 0; j < i->size(); ++j) {
        (*i)[j] = toupper((*i)[j]);
    }
}

但是如果你只想用<algorithm><iterator>工具编写它,你可以制作一个仿函数:

struct string_to_upper {
    std::string operator()(const std::string& input) const {
        std::string output;
        std::transform(
            input.begin(),
            input.end(),
            std::back_inserter(output),
            static_cast<int(*)(int)>(std::toupper)
        );
        return output;
    }
};

// ...

std::transform(
    a_list.begin(),
    a_list.end(),
    a_list.begin(),
    string_to_upper()
);
于 2013-05-29T09:34:39.090 回答