加速 C++,练习 14.5 涉及重新实现一个split
函数(将文本输入转换为字符串向量)。std::string
必须在类 ( Str
)中使用存储输入并使用split
函数返回 a Vec<Str>
,Vec
作为std::vector
类容器。该类管理一个指向底层Str
的自定义指针 ( ) 。Ptr
Vec<char> data
该类在下面Str
提供了一个构造函数,该构造函数构造一个底层
当我尝试通过调用
我在出现问题的代码中详述的方法来创建子字符串时,就会出现问题。这是该类的精简版本(如果需要,可以发布更多代码):Str(i,j)
Str.h
Ptr
Vec
str(i,j)
Str
Str.h
#include "Ptr.h"
#include "Vec.h"
class Str {
friend std::istream& operator>>(std::istream&, Str&);
public:
// define iterators
typedef char* iterator;
typedef char* const_iterator;
iterator begin() { return data->begin(); }
const_iterator begin() const { return data->begin(); }
iterator end() { return data->end(); }
const_iterator end() const { return data->end(); }
//** This is where we define a constructor for `Ptr`s to substrings **
template<class In> Str(In i, In j): data(new Vec<char>) {
std::copy(i, j, std::back_inserter(*data));
}
private:
// store a Ptr to a Vec
Ptr< Vec<char> > data;
};
Split.h
Vec<Str> split(const Str& str) {
typedef Str::const_iterator iter;
Vec<Str> ret;
iter i = str.begin();
while (i != str.end()) {
// ignore leading blanks
i = find_if(i, str.end(), not_space);
// find end of next word
iter j = find_if(i, str.end(), space);
// copy the characters in `[i,' `j)'
if (i != str.end())
ret.push_back(**substring**); // Need to create substrings here
// call to str(i,j) gives error, detailed below
i = j;
}
return ret;
}
我的第一个想法是使用这个构造函数来创建(指向)所需的子字符串。在这里调用str(i,j)
会给出错误消息
type 'const Str' does not provide a call operator
- 似乎不能简单地调用
str(i,j)
这里。为什么不? - 解决方案可以是编写一个
Str
类似于的成员函数substr
吗?