std string使用 (三)

2014-11-24 11:48:40 · 作者: · 浏览: 5
果分隔符是空格、tab 和回车之类,那么这样就够了:

string s("hello world, bye.");
vector vect;
vect.assign(
istream_iterator(stringstream(s)),
istream_iterator()
);

不过要注意,如果 s 很大,那么会有效率上的隐忧,因为 stringstream 会 copy 一份 string 给自己用。

------------------------------------------------------------------------
concat
把一个装有 string 的容器里面所有的 string 连接起来,怎么做?希望你不要说是 hand code 循环,这样做不是更好?

vector vect;
vect.push_back("hello");
vect.push_back(", ");
vect.push_back("world");

cout << accumulate(vect.begin(), vect.end(), string(""));

不过在效率上比较有优化余地。

-------------------------------------------------------------------------

reverse
其实我比较怀疑有什么人需要真的去 reverse 一个 string ,不过做这件事情的确是很容易:

std::reverse(s.begin(), s.end());

上面是原地反转的方法,如果需要反转到别的 string 里面,一样简单:

s1.assign(s.rbegin(), s.rend());

效率也相当理想。

-------------------------------------------------------------------------

解析文件扩展名
字数多点的写法:

std::string filename("hello.exe");

std::string::size_type pos = filename.rfind(''.'');
std::string ext = filename.substr(pos == std::string::npos filename.length() : pos + 1);

不过两行,合并成一行呢?也不是不可以:

std::string ext = filename.substr(filename.rfind(''.'') == std::string::npos filename.length() : filename.rfind(''.'') + 1);

我知道,rfind 执行了两次。不过第一,你可以希望编译器把它优化掉,其次,扩展名一般都很短,即便多执行一次,区别应该是相当微小。

GBK中文编码和std::string的冲突问题
最近写了一个按照分隔符拆分字符串的接口,
void PickUp(std::string &strDes,std::vector

&vecData,const std::string sign=";" )
{
std::string::size_type fpos=0,bpos=0;
std::string strTemp;
while(bpos != std::string::npos && strDes.size())
{
bpos = strDes.find(sign,fpos);
strTemp = strDes.substr (fpos,bpos-fpos);
vecData.push_back (strTemp);
fpos = bpos+1;
}
}
开始用得挺舒服没有出现问题,但是后来出现了一个新的需求又用到这个接口,但是分隔符不再是默认的";",而是换成了下划线"_"。这时问题出现了:比如下代码
int main() www.2cto.com
{
std::string strDes(" 关_ ");
std::vector vecTemp;
PickUp(strDes,vecTemp,"_");
system("pause");
return 0;
}
粗看可能看不出什么问题,但是结果是错误的,仔细断点跟踪并网上查阅了相关资料,终于弄懂原因了。
std::string 的find函数是按照单字节查找对比的,而GBK 采用双字节表示,总体编码范围为 0x8140-FEFE,首字节在 0x81-FE 之间,尾字节在 0x40-FE 之间
而 字的内存数据为e9 5f, 字的内存数据为c5 5f,下划线"_"的内存为5f,也就是说 字的尾字节和下划线ascii"_"是一样的,不行的是std::string 的find是采用单字节查找的,所以出现的结果是vecTemp的size()变成了4,其中包括两个空的字符串,而不是预期的结果2;而之前没有出问题是因为分隔符分号的缘故";",";"的ascii码是小于0x40的。
所以解决此种问题的办法就是分隔符应该去小于0x40也就是ascii码小于64的,至于哪些小于64就需自己去查了
或者可以自己写个单字节比较find算法.....

boost::tokenizer不错

作者:zhongguoren666