C++ 是否从字符串中删除字符的第一个和最后一个实例?
我假设以下代码没有编译,因为我混合了正向迭代器和反向迭代器。为什么我不能这样混合呢?我怎样才能让它工作?我想删除字符串的第一个和最后一个引号,但保留所有内部引号C++ 是否从字符串中删除字符的第一个和最后一个实例?,c++,C++,我假设以下代码没有编译,因为我混合了正向迭代器和反向迭代器。为什么我不能这样混合呢?我怎样才能让它工作?我想删除字符串的第一个和最后一个引号,但保留所有内部引号 temp.assign(find(value.begin(), value.end(), '\"'), find(value.rbegin(), value.rend(), '\"')); 我甚至不能这样做。反向迭代器的意义是什么 value.erase(find(value.begin(), value.end(), '\"'));
temp.assign(find(value.begin(), value.end(), '\"'), find(value.rbegin(), value.rend(), '\"'));
我甚至不能这样做。反向迭代器的意义是什么
value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"'));
我认为问题在于erase需要一个正向迭代器,而不是反向迭代器。正如其他人所指出的,您可以根据find的结果使用.base()来转换它们
您也可以使用find_end来代替。我认为问题在于erase需要一个正向迭代器,而不是反向迭代器。正如其他人所指出的,您可以根据find的结果使用.base()来转换它们
也可以使用find_end。如果要使用reverse_itertators,请对其调用.base(),将其转换为基础迭代器类型。e、 g
value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());
可能会达到这个目的。如果要使用反向迭代器,请将其上的.base()调用为基础迭代器类型。e、 g
value.erase(find(value.begin(), value.end(), '\"'));
value.erase(find(value.rbegin(), value.rend(), '\"').base());
可能就可以了。赋值函数(无论temp
的类型如何)需要
相同类型的两个迭代器。反向迭代器没有
与普通迭代器的类型相同。你可以在
使用上的base()
函数的基础普通迭代器
反向迭代器,但要小心;这是一个落后的立场
反向迭代器指向。例如,如果你写
temp.assign( find( value.begin(), value.end(), '\"' ),
find( value.rbegin(), value.rend(), '\"').base() );
,尾随的“将是结果字符串的一部分
这种特殊的行为通常是你在工作时想要的
将结果用作起始迭代器:
std::string( std::find( fn.rbegin(), fn.rend(), '.' ), fn.end() )
例如,将在最后一个
使用反向迭代器查找结果时
作为最终标准,您通常需要将其保存在
变量,并以某种方式“更正”它
最后,在使用
两次查找的结果定义了一个范围,如上面所述。如果
例如,您的文本中没有“””
,您将以
相当于:
temp.assign( value.end(), value.begin() );
,这是行不通的
编辑:
例如,如果您不想要“
字符,我认为
应采取以下措施:
// Returns an empty string if there are not two " chars.
std::string
extractQuoted( std::string const& original )
{
// end points to one after the last '"', or begin() if no '"'.
std::string::const_iterator end
= std::find( original.rbegin(), original.rend(), '"' ).base();
if ( end != original.begin() ) {
-- end; // Since we don't want the '"' in the final string
}
return std::string( std::find( original.begin(), end, '"' ), end );
}
(这是我脑子里想不出来的,所以不能保证,但应该是这样
让您从正确的方向开始。)分配功能(无论temp
的类型如何)需要
两个相同类型的迭代器。反向迭代器没有
与普通迭代器的类型相同
使用上的base()
函数的基础普通迭代器
反向迭代器,但要小心;它位于
反向迭代器指向。例如,如果
temp.assign( find( value.begin(), value.end(), '\"' ),
find( value.rbegin(), value.rend(), '\"').base() );
,尾随的“将是结果字符串的一部分
这种特殊的行为通常是你在工作时想要的
将结果用作起始迭代器:
std::string( std::find( fn.rbegin(), fn.rend(), '.' ), fn.end() )
例如,将在最后一个
。
。使用反向迭代器查找结果时
作为最终标准,您通常需要将其保存在
变量,并以某种方式“更正”它
最后,在使用
两次查找的结果定义了一个范围,如上面所述。如果
例如,您的文本中没有“””
,您将以
相当于:
temp.assign( value.end(), value.begin() );
,这是行不通的
编辑:
例如,如果您不想要“
字符,我认为
应采取以下措施:
// Returns an empty string if there are not two " chars.
std::string
extractQuoted( std::string const& original )
{
// end points to one after the last '"', or begin() if no '"'.
std::string::const_iterator end
= std::find( original.rbegin(), original.rend(), '"' ).base();
if ( end != original.begin() ) {
-- end; // Since we don't want the '"' in the final string
}
return std::string( std::find( original.begin(), end, '"' ), end );
}
(这是我脑子里想不出来的,所以不能保证,但应该是这样
从正确的方向开始。)您也可以使用
value.erase(0, value.find('\"') + 1);
value.erase(value.rfind('\"'), value.size());
假设字符串始终包含至少两个“
s,您也可以使用
value.erase(0, value.find('\"') + 1);
value.erase(value.rfind('\"'), value.size());
假设字符串始终包含至少两个“
s这个怎么样
void stripLeadingAndTrailingQuotes(std::string& s) {
if (s[0] == '\"')
s.erase(0, 1);
size_t last = s.length() - 1;
if (s[last] == '\"')
s.erase(last, 1);
}
迭代器是有效的,但我认为上面的内容更具可读性。这个怎么样
void stripLeadingAndTrailingQuotes(std::string& s) {
if (s[0] == '\"')
s.erase(0, 1);
size_t last = s.length() - 1;
if (s[last] == '\"')
s.erase(last, 1);
}
迭代器是有效的,但我认为上面的内容更具可读性。你可以复制一个
std::string stripped(str.begin()+1,str.end()-1)
并仅在begin和end有效且包含引号时断言或执行引号可能不是第一个或最后一个字符,很抱歉没有说清楚。@user814628更不用说如果你给函数传递一个空字符串会发生什么。请注意,assign(it1,it2)
将放弃所有直到it1
的内容,以及所有从it2
开始的内容。如果您只想删除it1
和it2
处的字符,这不是您想要的。您可以只制作一个副本std::string stripped(str.begin()+1,str.end()-1)
,并仅在begin和end有效且包含引号时断言或执行引号可能不是第一个或最后一个字符,很抱歉没有说清楚。@user814628更不用说如果你给函数传递一个空字符串会发生什么。请注意,assign(it1,it2)
将放弃所有直到it1
的内容,以及所有从it2
开始的内容。如果您只想删除it1
和it2
处的字符,这不是您想要的。使用反向迭代器查找某个事件的最后一次发生是完全有效的,而且是惯用的。@JamesKanze是的,我想您是对的,我不知道.base()。已编辑。使用反向迭代器查找某事物的最后一次出现是完全有效的和惯用的。@JamesKanze是的,我认为你是对的,我不知道.base()。编辑过,也可能没有。我怀疑他不想在最后一个字符串中包含“
”,或者可能不需要。我怀疑他不想在最后一个字符串中包含“
。首先,这是一个危险的假设。其次,您的代码将只删除“
字符;在