字符串的拼接
在C++中因为有了string类,我们可以使用”+”或者”+=”运算符来直接拼接字符串或者用append(),非常方便.
不会像C 语言中的strcat()
char *strcat(char *dest, const char *src); 将参数 src 字符串复制到参数 dest 所指的字符串尾部,
string s1 ="s1";
string s2 ="s2";
string s3 = s1+s2;
string s4 = "wahaha"
s3.append(s4);
cout<<s3<<endl;
输出
s1s2 wahaha
分割字符串
C++中string类并没有提供split函数分割.
参考他人C++ Split()函数的实现
如果是切分文件名"C:\Windows\aaa.txt"
获得 aaa.txt
通过string::find_last_of
#include <iostream> // std::cout
#include <string> // std::string
void SplitFilename (const std::string& str)
{
std::cout << "Splitting: " << str << '\n';
unsigned found = str.find_last_of("/\\");
std::cout << " path: " << str.substr(0,found) << '\n';
std::cout << " file: " << str.substr(found+1) << '\n';
}
int main () {
std::string str1 ("/usr/bin/man"); //需要find "/\\"
std::string str2 ("c:\\windows\\aaa.txt");
SplitFilename (str1);
SplitFilename (str2);
return 0;
}
output:
Splitting: /usr/bin/man
path: /usr/bin
file: man
Splitting: c:\windows\aaa.txt
path: c:\Windows
file: aaa.txt
而QString有 QString::split()
可将一个串分离为子串的QStringList:
QString str = "polluter pays principle";
QStringList words = str.split(" ");
上例中,我们将”polluter pays principle”串分离为三个子串List[0]=”polluter”, List[1]=”pays”, List[2]= “principle”.
split()函数有个可选的第三个参数,指定是否保留空子串,默认为保留。
使用join(),可以将QStringList中的项联结起来形成一个串。join()的参数被插入到每对被联结的串间。如
words.sort();
str = words.join("\\\\");
输出polluter\\pays\\principle
对于双斜杠\\
的输出,由于程序里面\\
代表一个反斜线字符’\’
如printf("C:\\User\\My");
输出结果为C:\User\My
所以需要\\\\
随机生成字符串
在C++11之后这样的功能函数在标准库中已有对应的提供std::shuffle
template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
大概原理类似如下代码的功能:
顺序容器迭代器的开头(begin)和结尾(end),在[first, last)这个前闭后开区间内的数值将会被随机排序,顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换,g
唯一随机数生成器的一个实例,在头文件<random>
中定义。URNG
是 uniform random number generator
的缩写。
template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g)
{
for (auto i = (last-first) - 1; i > 0; --i) {
std::uniform_int_distribution<decltype(i)> d (0,i);
swap (first[i], first[d (g)]);
}
}
数字随机排序
#include <iostream>
#include <vector>
#include <algorithm> // std::move_backward
#include <random> // std::default_random_engine
#include <chrono> // std::chrono::system_clock
int main (int argc, char* argv[])
{
std::vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back (i);
}
// obtain a time-based seed:
unsigned seed = std::chrono::system_clock::now ().time_since_epoch ().count ();
std::shuffle (v.begin (), v.end (), std::default_random_engine (seed));
for (auto& it : v) {
std::cout << it << " ";
}
std::cout << "\n";
return 0;
}
字符串随机排序
使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列
const int max_len = 9;
string valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
if(C++11)
{ random_device rd;
mt19937 g(rd()); //std::default_random_engine
std::shuffle(valid_chars.begin(), valid_chars.end(), g); //C++11 VS2012+ std::shuffle
shuffle(valid_chars.begin(), valid_chars.end(), g);
}
else
{
SelfGenerator sg;
random_shuffle(valid_chars.begin(), valid_chars.end(), sg); //std::random_shuffle()
}
string rand_str(valid_chars.begin(), valid_chars.begin() + max_len);
return rand_str;
class SelfGenerator
{
public:
ptrdiff_t operator() (ptrdiff_t max)
{
double temp;
temp = static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
return static_cast<ptrdiff_t>(temp * max);
}
};
[参考]
【C++ STL应用与实现】64: 如何使用shuffle和random_shuffle : 洗牌 (since C++11)
【find_last_of】