gpt4 book ai didi

c++ - io 用于 std::string 的非关联容器

转载 作者:行者123 更新时间:2023-11-30 02:03:41 25 4
gpt4 key购买 nike

我想为库中的 std::string 容器提供基于行的通用 IO。基于行,因为字符串可能包含空格。下面的代码似乎工作正常,但我不确定这是否是最好的方法,或者它是否会产生一些歧义,我无法理解。

#define boostForeach BOOST_FOREACH

template< template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container >
std::ostream& operator<< (std::ostream& o, Container<std::string>const & container){
boostForeach(std::string const& str, container) {
o << str << "\n";
}
return o;
}

template< template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container >
std::istream& operator>> (std::istream& in, Container<std::string>& container){
container.clear();
std::string buf;
while(getline(in, buf)) {
if(buf.empty()) break; //stop if empty line found to separate map from other data
container.insert(container.end(),buf);
}
return in;
}

所以问题是:这安全可靠吗?

最佳答案

您可以使用 std::copy() 编写输出算法:

std::copy(container.begin(),
container.end(),
std::ostream_iterator<std::string>(o, "\n"));

您可以使用输入迭代器进行段落输入,即用空行分隔的多行:

class istream_paragraph_iterator: public std::iterator<std::forward_iterator_tag,std::string>{
std::istream* stream;
std::string line;
public:

istream_paragraph_iterator() : stream(0) {}

istream_paragraph_iterator(std::istream& stream) : stream(&stream) {++*this; //get the first element
}

std::string operator*() const {
return line;
}

const std::string* operator->() const {
return &line;
}

istream_paragraph_iterator& operator++() {
if (stream && (!std::getline(*stream, line) || line.empty()))
stream = 0;
return *this;
}

istream_paragraph_iterator operator++(int) {
istream_paragraph_iterator previous(*this);
++*this;
return previous;
}

bool operator==(const istream_paragraph_iterator& other) const {
return stream == other.stream;
}

bool operator!=(const istream_paragraph_iterator& other) const {
return !(*this == other);
}

};

然后你可以使用 std::copy() 编写输入算法还有:

std::copy(istream_paragraph_iterator(in),
istream_paragraph_iterator(),
std::back_inserter(container));

将逻辑分离到迭代器类型中可以使输入和输出算法参数化,从而更通用。在模板库中,这通常是一件好事。我会避免为标准容器添加重载,因为你无法知道它们在每个平台上都做了正确的事情;基于迭代器的算法更具可移植性,您不必编写所有 template<template<...> class ...>粗鲁。

关于c++ - io 用于 std::string 的非关联容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com