我有一个矢量,它的内容是这样的..
std::vector<string> vec;
vec.push_back("XXXX_LLLL");
vec.push_back("XXXX_HHHH");
vec.push_back("XXXX_XXXX");
我想迭代向量并删除&#34; _&#34;从字符串。我已经尝试过使用find-erase成语,我用了一个结构来查找_。
vec.erase(remove_if(vec.begin(), vec.end(), IsUnderScore2()),vec.end());
但我意识到它没有迭代我的矢量字符串中的每个字符串,所以它永远不会删除下划线。是否有另一种迭代矢量的方法,以及它的各个组件,可以帮助我吗?
答案 0 :(得分:7)
遍历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());
}
答案 1 :(得分:4)
尝试以下方法。您可以使用应用于向量的每个字符串的标准算法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;
}
答案 2 :(得分:1)
使用正则表达式将如下所示:
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("_"), "");
}