C++ 用迭代器初始化 vector

标签 c++ string vector ifstream stringstream

我正在尝试将一个无符号字 rune 件读入一个 vector 中。我略微迂回的方法是创建一个输入文件流,将该数据读入一个字符串流,然后使用字符串流的内容初始化一个 vector 。可能有更好的方法来执行此操作,而我现有的代码使用某些文件会导致段错误。

string file_name = "output/comp" + to_string(start_id) + ".xml";

if( !file_exists(file_name))
{
    cout << "File could not be found." << endl;
    return 0;
}

ifstream ifs(file_name);
stringstream ss;
ss << ifs.rdbuf();
ss >> noskipws;

vector<unsigned char> raw_data(ss.str().begin(), ss.str().end());

我已经包含了所有必要的 header 和 using 声明,并且 file_exists() 返回一个 bool 值,指示文件是否存在。

我的问题是:为什么上面的代码不正确,正确实现相同目标的最佳方法是什么?

最佳答案

std::stringstream::str()返回一个 std::string。也就是说,它是一个临时字符串。

因此 ss.str().begin() 返回临时字符串的开始迭代器,ss.str().end() 返回结束迭代器不同 临时字符串,因为两个 ss.str() 调用都返回不同 临时字符串。您不能在不同对象之间混合使用迭代器!

要解决这个问题,请使用一个字符串:

std::string str = ss.str();

现在只需传递 str.begin()str.end()

关于C++ 用迭代器初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37924155/

相关文章:

string - VB6: "string = string * integer"是做什么的?

python - 来自字符串列表的字符串连接,每个元素在前面使用一个粒子,在末尾使用一个粒子

Java List , Vector 比较

C++ 基础 vector 指派生 vector

c++ - Qt:在函数中等待一段时间而不挂起用户界面

c++ - 为什么 unix-socket 文件在其创建者退出后仍然存在?我可以重复使用它吗?

c++ - luabind 如何隐式转换对象?

C++将字符串转换为int

c++: vector 获取意外数据

javascript - 在 v8 中将函数模板添加到全局对象原型(prototype)