C++ 向量';无符号字符迭代器的个数不工作

C++ 向量';无符号字符迭代器的个数不工作,c++,vector,stl,iterator,C++,Vector,Stl,Iterator,我想在向量的末尾剪切CRLF,但我的代码不起作用(while-equal的第一个循环调用并返回false)。在调试模式下“i”==0且具有“ptr”值==“0x002e4cfe” string testS=“\r\n\r\n\r\n\r\n\r\n\r\n”; 矢量数据_data.clear(); _data.insert(_data.end(),testS.begin(),testS.end()); 向量::迭代器i=_data.end(); uint32 bytesToCut=0; 而(i!

我想在向量的末尾剪切CRLF,但我的代码不起作用(while-equal的第一个循环调用并返回false)。在调试模式下“i”==0且具有“ptr”值==“0x002e4cfe”

string testS=“\r\n\r\n\r\n\r\n\r\n\r\n”;
矢量数据_data.clear();
_data.insert(_data.end(),testS.begin(),testS.end());
向量::迭代器i=_data.end();
uint32 bytesToCut=0;
而(i!=\u data.begin()){
if(等于(i-1,i,“\r\n”)){
bytesToCut+=2;
--i、 if(i==\u data.begin())返回;else--i;
}否则{
if(bytesToCut)_data.erase(_data.end()-bytesToCut,_data.end());
回来
}                    
}

非常感谢你的回答。但我需要迭代器的版本,因为我的代码是在解析块http传输数据时使用的,该数据被写入vector,我需要func,它将获取指向向量的指针,迭代器定义向后删除CRLF的位置。我认为,我所有的问题显然都包含在迭代器中。

首先,向量初始化是。。。非最优。您需要做的只是:

string testS = "\r\n\r\n\r\n<-3 CRLF Testing trim new lines 3 CRLF->\r\n\r\n\r\n";
vector<uint8> _data(testS.begin(), testS.end());
如果您想在向量中执行此操作,它是相同的基本过程:

_data.erase(std::remove_if(_data.begin(), _data.end(), [](uint8 ui)
{
    return ui == static_cast<uint8>('\r') || ui == static_cast<uint8>('\n');
}), _data.end());

或备选(如果<代码> \r\n也可以在字符串的中间):


相反,如果重新发明th车轮,您可以使用类似以下内容的现有STL algo:

std::string s;
s = s.substr(0, s.find_last_not_of(" \r\n"));

如果您只需要从末尾修剪
'\r'
&
'\n'
,那么简单的
substr
即可:

std::string str = "\r\n\r\n\r\nSome string\r\n\r\n\r\n";

size_t newLength = str.length();
while (str[newLength - 1] == '\r' || str[newLength - 1] == '\n') newLength--;
str = str.substr(0, newLength);

std::cout << str;
或:

bool isUnwantedChar(字符c){
返回(c='\r'| | c='\n');
}
int main(){
std::string str=“\r\n\r\n\r\n一些字符串\r\n\r\n\r\n”;
str.erase(std::remove_if(str.begin()、str.end()、isUnwantedChar)、str.end());

std::cout您的代码无效,至少是因为在算法std::equal中设置了不正确的范围

if(equal(i - 1, i, "\r\n")) {
在这个表达式中,您只比较迭代器i-1所指向的向量的一个元素与'\r'。您必须按照

if(equal(i - 2, i, "\r\n")) {
如果需要从向量中删除对“\r\n”,则我可以建议以下方法(我使用了自己的变量名并包括测试输出):

std::string s=“\r\n\r\n\r\n\r\n\r\n\r\n”;
向量v(s.begin(),s.end());

std::cout“但是我的代码不工作”是非常模糊的!改进你的问题…看起来OP想要删除字符串末尾的CRLF。你的版本到处都删除它。问题不清楚他是否只想删除以序列形式出现的CRLF,或者删除结尾的任何CR/LF字符。@interjay True。原始帖子的措辞是“不清楚。我将添加另一个版本以从结尾处删除它。@Zac Howland,谢谢,它非常紧凑,但我只需要将最后的换行符删除到与它们不同的第一个字符(从结尾处).P.S.我的算法与此类似,但从向量的开头清除这些字符效果很好。@Slinner更新包含的版本也可以删除结尾。@Zac Howland
std::string::reverse_iterator rit=std::find_if_not(testS.rbegin(),testS.rend(),[](char c){return c='\r'| c='\n'})
请告诉我它是什么?如何调用它?(在传递函数的参数列表中声明谓词函数find_if_)在哪里可以找到这些记录的语法信息?请注意,
std::remove
实际上并不删除元素,而是将未删除的元素定位在容器的开头。
std::string.erase
可以在不需要循环的情况下执行实际删除操作。
std::string s;
s = s.substr(0, s.find_last_not_of(" \r\n"));
std::string str = "\r\n\r\n\r\nSome string\r\n\r\n\r\n";

size_t newLength = str.length();
while (str[newLength - 1] == '\r' || str[newLength - 1] == '\n') newLength--;
str = str.substr(0, newLength);

std::cout << str;
#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string str = "\r\n\r\n\r\nSome string\r\n\r\n\r\n";
    str.erase(std::remove(str.begin(), str.end(), '\r'), str.end());
    str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
    std::cout << str;
}
bool isUnwantedChar(char c) {
    return (c == '\r' || c == '\n');
}

int main() {
    std::string str = "\r\n\r\n\r\nSome string\r\n\r\n\r\n";
    str.erase(std::remove_if(str.begin(), str.end(), isUnwantedChar), str.end());
    std::cout << str;
}
if(equal(i - 1, i, "\r\n")) {
if(equal(i - 2, i, "\r\n")) {
std::string s = "\r\n\r\n\r\n<-3 CRLF Testing trim new lines 3 CRLF->\r\n\r\n\r\n";
std::vector<unsigned char> v( s.begin(), s.end() );

std::cout << v.size() << std::endl;

auto last = v.end();
auto prev = v.end();

while ( prev != v.begin() && *--prev == '\n' && prev != v.begin() && *--prev == '\r' )
{
    last = prev;
}

v.erase( last, v.end() );

std::cout << v.size() << std::endl;