【问题标题】:Removing items from vector string C++从向量字符串 C++ 中删除项目
【发布时间】:2014-06-24 19:47:18
【问题描述】:

我有一个向量,它的内容是这样的..

std::vector<string> vec;

vec.push_back("XXXX_LLLL");
vec.push_back("XXXX_HHHH");
vec.push_back("XXXX_XXXX");

我想遍历向量并从字符串中删除“_”。我已经尝试过使用 find-erase 习惯用法,并使用我创建的结构来查找 _。

vec.erase(remove_if(vec.begin(), vec.end(), IsUnderScore2()),vec.end());

但我意识到它不会遍历向量字符串中的每个单独的字符串,因此它永远不会删除下划线。是否有另一种迭代向量的方法,它是单个组件,可以帮助我吗?

【问题讨论】:

  • 您将不得不在此处更深入并迭代您正在迭代的事物的字符,或者按照 Chad 的建议使用变换。
  • 您是否想过在发布问题之前搜索答案?查看那边的“相关”列表-->
  • @liquid 查看我更新的帖子。它包含你需要的一切。

标签: c++ vector


【解决方案1】:

遍历vector 并在每个字符串上使用erase-remove 惯用语,而不是像现在这样在vector 元素上使用

std::vector<string> vec;

vec.push_back("XXXX_LLLL");
vec.push_back("XXXX_HHHH");
vec.push_back("XXXX_XXXX");

for(auto& str : vec) {
  str.erase(std::remove(str.begin(), str.end(), '_'), 
            str.end());
}

C++03版本:

for(std::vector<std::string>::iterator it = vec.begin(), it != vec.end(), ++it) {
  it->erase(std::remove(it->begin(), it->end(), '_'), 
            it->end());
}

【讨论】:

  • 您的remove_if 只是一个带有额外内容的remove。 (我有时会这样做。)
  • 我不熟悉使用带有 'auto' 的 for 循环我必须查找这个实现,我已经尝试使用它并且我的编译器在抱怨......我不认为我的C++ 版本支持此实现。这是我的错误:警告:“自动”将改变 C++0x 中的含义;请删除它
  • @liquid 我添加了 C++03 版本。如果您将-std=c++11(或-std=c++0x,如果您有较旧的编译器)开关添加到编译器命令行,您可能能够编译第一个版本。
  • 这成功了!谢谢!我将尝试将 C++ 11 选项添加到我的编译器中。非常感谢。
【解决方案2】:

试试下面的。您可以使用标准算法std::remove 应用于向量的每个字符串。

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

int main()
{
    std::vector<std::string> vec;

    vec.push_back("XXXX_LLLL");
    vec.push_back("XXXX_HHHH");
    vec.push_back("XXXX_XXXX");

    for ( std::string &s : vec )
    {
        s.erase( std::remove( s.begin(), s.end(), '_'), s.end() );
    }

    for ( const std::string &s : vec ) std::cout << s << std::endl;

    return 0;
}

输出是

XXXXLLLL
XXXXHHHH
XXXXXXXX

如果您的编译器不支持 C++ 2011,那么您可以编写

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

int main()
{
    std::vector<std::string> vec;

    vec.push_back("XXXX_LLLL");
    vec.push_back("XXXX_HHHH");
    vec.push_back("XXXX_XXXX");

    for (std::vector<std::string>::iterator it = vec.begin(); it != vec.end(); ++it )
    {
        it->erase( std::remove( it->begin(), it->end(), '_'), it->end() );
    }

    for (std::vector<std::string>::iterator it = vec.begin(); it != vec.end(); ++it )
    {
        std::cout << *it << std::endl;
    }

    return 0;
}

【讨论】:

  • 这也有效!希望我能要求多个答案,非常感谢。
【解决方案3】:

使用正则表达式看起来像:

for_each(vec.begin(), vec.end(), [&](string &str) {
    regex_replace(str.begin(), str.begin(), str.end(), regex("_"), "");
});

Demo

基于范围的 for 循环版本可能更具可读性:

for(auto &str : vec) {
    regex_replace(str.begin(), str.begin(), str.end(), regex("_"), "");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多