You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将const修饰的std::string转小写后插入std::set的实现问题

解决方案

核心思路是不修改原const字符串,仅将原字符串作为只读输入源,把小写转换后的结果直接输出到新字符串中再插入set,完全符合const auto& item的约束要求,也可以实现不显式声明命名临时变量的需求。

修改后的循环代码示例:

for (const auto& item : in) {
    // 不需要修改原item,直接构造新字符串做转换
    std::string lower_str;
    lower_str.reserve(item.size());
    std::transform(item.cbegin(), item.cend(), std::back_inserter(lower_str), ::tolower);
    out.insert(std::move(lower_str));
}

如果要求完全不出现显式声明的额外临时变量,可以用立即调用的lambda表达式把转换逻辑封装在insert参数内:

for (const auto& item : in) {
    out.insert([&](){
        std::string res;
        res.reserve(item.size());
        std::transform(item.cbegin(), item.cend(), std::back_inserter(res), ::tolower);
        return res;
    }());
}

原代码报错原因说明

你原有写法的问题是把std::transform的输出迭代器指向了const字符串的起始位置,相当于尝试修改只读的item对象,自然不符合const约束。只要把转换结果输出到新的字符串对象即可,不会触碰原item的const限制,用reserve预分配空间+std::move转移所有权的写法也没有额外的性能开销。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:04