字符串的拼接分割

3 篇文章 0 订阅

字符串的拼接

在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>中定义。URNGuniform 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】



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值