字符串迭代器不兼容 boost::tokenizer

Posted

技术标签:

【中文标题】字符串迭代器不兼容 boost::tokenizer【英文标题】:string iterators incompatible boost::tokenizer 【发布时间】:2015-03-17 18:37:39 【问题描述】:

我有一个包含 boost::tokenizer 的类的简单代码示例。

MyTokenizer.h

#pragma once

#include <iostream>
#include <boost/tokenizer.hpp>

class MyTokenizer

public:
    typedef boost::tokenizer< boost::escaped_list_separator<char> > TokType;

    MyTokenizer(std::string);
    ~MyTokenizer() ;
    void printTok();

private:
    const TokType tok_;

;

MyTokenizer.cpp

#include "MyTokenizer.h"


MyTokenizer::MyTokenizer(std::string input) :
tok_(input)

    std::cout << "Created tokenizer from: " << input << std::endl;
    for (TokType::iterator it = tok_.begin(); it != tok_.end(); ++it)
        std::cout << *it << std::endl;
    


void MyTokenizer::printTok()
    std::cout << "printing tokens" << std::endl;
    for (TokType::iterator it = tok_.begin(); it != tok_.end(); ++it)
        std::cout << *it << std::endl;
    

ma​​in.cpp

#include "MyTokenizer.h"

int main(void)
    std::string input("a,b,c");
    MyTokenizer tok(input);
    tok.printTok();

当我运行这个例子时,它通过构造函数很好,在循环中打印预期的标记,但是在调用 printTok() 时它给出了这个错误

似乎我无法在构造函数之外创建 MyTokenizer 的迭代器。

编辑

我将 printTok() 方法更改为更简单,同时仍然抛出现在看起来像这样的相同错误。

void MyTokenizer::printTok()
    TokType::iterator it = tok_.begin();

【问题讨论】:

【参考方案1】:

好的,我自己解决了这个问题。问题是我构建标记器的字符串在构造函数的末尾被取消分配。我通过在我的类中存储输入字符串的副本并从该字符串构建我的标记器来修复它。

【讨论】:

以上是关于字符串迭代器不兼容 boost::tokenizer的主要内容,如果未能解决你的问题,请参考以下文章

循环上的向量迭代器不兼容

opencv“向量迭代器不兼容”

在自包含向量循环中删除时“向量迭代器不兼容”

C++ for-each 语句触发“向量迭代器不兼容”断言失败:this->_Getcont() == 0

为啥 C++ 字符串迭代器不检查错误?

Boost.Tokenizer 用于引号和括号