首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ToLower std::vector<std::string>

ToLower std::vector<std::string>
EN

Stack Overflow用户
提问于 2018-03-21 17:25:27
回答 2查看 1.7K关注 0票数 1

这与以下问题有关:

String array to C++ function

尽管现在一切都很好,但我唯一不能完成的事情就是在收到错误时将用户输入:

函数

代码语言:javascript
复制
bool lookupTerm(const std::string& term, const std::vector<std::string>& possible_names) {

    transform(term.begin(), term.end(), term.begin(), ::tolower);
    for (const std::string &possible_name : possible_names)
    {
        if (possible_name.compare(term) == 0)
            return true;
    }
    return false;
}

参数

代码语言:javascript
复制
const std::vector<std::string> possible_asterisk         = { "star" , 
                                                              "asterisk" , 
                                                              "tilde"};
string term = "SoMeWorD";

错误

代码语言:javascript
复制
 In file included from /usr/include/c++/7.2.0/algorithm:62:0,
                 from jdoodle.cpp:5:
/usr/include/c++/7.2.0/bits/stl_algo.h: In instantiation of '_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; _OIter = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; _UnaryOperation = int (*)(int) throw ()]':
jdoodle.cpp:40:64:   required from here
/usr/include/c++/7.2.0/bits/stl_algo.h:4306:12: error: assignment of read-only location '__result.__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >::operator*()'
  *__result = __unary_op(*__first);

我知道转换应该收到一个字符串。我如何暂时将std::vector转换为简单的字符串,以便将该单词转换为小写呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 17:30:19

这是因为termconst引用。在将其转换为小写之前,复制一份:

代码语言:javascript
复制
bool lookupTerm(const std::string& term, const std::vector<std::string>& possible_names) {
    std::string lower(term);
    transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
    for (const std::string &possible_name : possible_names)
    {
        if (possible_name.compare(lower) == 0)
            return true;
    }
    return false;
}

您还可以通过删除const并按值获取参数来达到同样的效果:

代码语言:javascript
复制
bool lookupTerm(std::string term, const std::vector<std::string>& possible_names) {
票数 7
EN

Stack Overflow用户

发布于 2018-03-21 17:32:29

std::transform需要能够将第三个参数取消引用的内容更改为。

因为term是一个const对象,所以这在您的情况下不起作用。

您可以创建函数本地对象来存储转换后的字符串。

代码语言:javascript
复制
std::string lowercaseTerm(term);
transform(term.begin(), term.end(), lowercaseTerm.begin(), ::tolower);

然后在下面的行中使用lowercaseTerm

代码语言:javascript
复制
  if (possible_name.compare(lowercaseTerm) == 0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49412903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档