Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从向量字符串C+中删除项+;_C++_Vector - Fatal编程技术网

C++ 从向量字符串C+中删除项+;

C++ 从向量字符串C+中删除项+;,c++,vector,C++,Vector,我有一个向量,它的内容是这样的 std::vector<string> vec; vec.push_back("XXXX_LLLL"); vec.push_back("XXXX_HHHH"); vec.push_back("XXXX_XXXX"); 但我意识到它不会在向量字符串中的每个字符串上迭代,所以它永远不会删除下划线。有没有另一种迭代向量的方法,以及它的各个组件,可以在这里帮助我?迭代向量,并在每个字符串上使用擦除-删除习惯用法,而不是像现在这样在向量元素上 std::ve

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

std::vector<string> vec;

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

但我意识到它不会在向量字符串中的每个字符串上迭代,所以它永远不会删除下划线。有没有另一种迭代向量的方法,以及它的各个组件,可以在这里帮助我?

迭代
向量
,并在每个字符串上使用擦除-删除习惯用法,而不是像现在这样在
向量
元素上

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());
}
std::向量向量向量机;
向量推回(“XXXX”);
向量向后推(“XXXX”);
向量向后推(“XXXX”);
用于(自动&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());
}
for(std::vector::iterator it=vec.begin(),it!=vec.end(),++it){
它->擦除(std::remove(它->开始(),它->结束(),''.'),
it->end());
}

尝试以下操作。可以对向量的每个字符串使用标准算法
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;
}
如果编译器不支持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;
}
#包括
#包括
#包括
#包括
int main()
{
std::vec;
向量推回(“XXXX”);
向量向后推(“XXXX”);
向量向后推(“XXXX”);
对于(std::vector::iterator it=vec.begin();it!=vec.end();++it)
{
它->擦除(std::remove(它->开始(),它->结束(),它->结束());
}
对于(std::vector::iterator it=vec.begin();it!=vec.end();++it)
{

std::cout使用正则表达式

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

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

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

你必须在这里更深入地迭代你要迭代的内容的字符,或者按照Chad的建议使用转换。你想过在发布问题之前搜索答案吗?请参阅“相关”部分列表在那里-->@liquid查看我的最新帖子。它包含了你所需要的所有内容。如果你的
remove\u
只是一个
remove
和额外的东西。(我有时会这样做。)我不熟悉使用AF for AutoCo,我必须查一下这个实现,我试过用它,我的编译器在抱怨…我不认为我的C++版本支持这个实现。这是我的错误:警告:“Auto'”将改变C++中的含义;请删除it@liquid我已经添加了C++03版本。您可以如果您添加
-std=c++11
(如果您有较旧的编译器,则获取要编译的第一个版本)切换到编译器命令行。这是有效的!谢谢!我会尝试在我的编译器中添加C++ 11选项。非常感谢。这也是有效的。希望我能提出多个答案,非常感谢。
for_each(vec.begin(), vec.end(), [&](string &str) {
    regex_replace(str.begin(), str.begin(), str.end(), regex("_"), "");
});
for(auto &str : vec) {
    regex_replace(str.begin(), str.begin(), str.end(), regex("_"), "");
}