无符号字符迭代器的向量不起作用



我想在向量的末端切割crlf,但是我的代码不起作用(在wir的第一个循环中 - 均等 - 呼叫和返回false)。在调试模式" i" == 0中,并具有" ptr"值==" 0x002e4cfe"

string testS = "rnrnrn<-3 CRLF Testing trim new lines 3 CRLF->rnrnrn";
vector<uint8> _data; _data.clear();
_data.insert(_data.end(), testS.begin(), testS.end());
vector<uint8>::iterator i = _data.end();
uint32 bytesToCut = 0;
while(i != _data.begin()) {
    if(equal(i - 1, i, "rn")) {
        bytesToCut += 2;                
        --i; if(i == _data.begin()) return; else --i;
    } else {
        if(bytesToCut) _data.erase(_data.end() - bytesToCut, _data.end());
        return;
    }                    
}

非常感谢您的回答。但是我需要使用迭代器的版本,因为当我解析块的HTTP传输数据时使用我的代码,该数据写入矢量,我需要弹性,这将向向量和迭代器进行指示,并定义该位置以向后删除CRLF。我认为,我所有的问题显然都包含在迭代器中。

您的代码至少是由于设置算法std中的不正确范围而无效

if(equal(i - 1, i, "rn")) {

在此表达式中,您仅比较迭代器i -1指向' r'指向的向量的一个元素。你必须写一些

if(equal(i - 2, i, "rn")) {

如果您需要从矢量中删除" r n"对,那么我可以建议以下方法(我使用了我自己的变量名称并包括测试输出):

std::string s = "rnrnrn<-3 CRLF Testing trim new lines 3 CRLF->rnrnrn";
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;

相反,如果重新发明了轮子,则可以使用以下类型的算法来:

std::string s;
s = s.substr(0, s.find_last_not_of(" rn"));

如果您只需修剪'r'&amp;'n'从末端开始,然后简单的substr会做:

std::string str = "rnrnrnSome stringrnrnrn";
size_t newLength = str.length();
while (str[newLength - 1] == 'r' || str[newLength - 1] == 'n') newLength--;
str = str.substr(0, newLength);
std::cout << str;

不要流汗小东西:)


删除所有'r''n'可能很简单,因为(C 03):

#include <iostream>
#include <string>
#include <algorithm>
int main() {
    std::string str = "rnrnrnSome stringrnrnrn";
    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 = "rnrnrnSome stringrnrnrn";
    str.erase(std::remove_if(str.begin(), str.end(), isUnwantedChar), str.end());
    std::cout << str;
}

首先,您的向量初始化是...不最佳的。您需要做的就是:

string testS = "rnrnrn<-3 CRLF Testing trim new lines 3 CRLF->rnrnrn";
vector<uint8> _data(testS.begin(), testS.end());

第二,如果要删除rn字符,则可以在字符串中完成:

testS.erase(std::remove_if(testS.begin(), testS.end(), [](char c)
{
    return c == 'r' || c == 'n';
}), 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());

您的问题可能是由于循环中的无效迭代器的使用情况(这还有其他逻辑上的问题,但是由于它不应该存在,我不会触及),从而消除了1 by-1的元素。

如果您只想从字符串/向量末端删除项目,它将略有不同,但仍然是相同的基本模式:

int start = testS.find_first_not_of("rn", 0); // finds the first non-rn character in the string
int end = testS.find_first_of("rn", start); // find the first rn character after real characters
// assuming neither start nor end are equal to std::string::npos - this should be checked
testS.erase(testS.begin() + end, testS.end()); // erase the `rn`s at the end of the string.

或替代(如果rn也可以位于字符串的中间):

std::string::reverse_iterator rit = std::find_if_not(testS.rbegin(), testS.rend(), [](char c)
{
    return c == 'r' || c == 'n';
});
testS.erase(rit.base(), testS.end());

最新更新