C++STL-ALGORITHM函数

本文介绍了C++标准模板库(STL)中的关键算法,包括foreach遍历元素、generate生成值、sort排序、fill填充、merge合并排序、replace替换元素及count计数等,展示了这些算法如何简化和优化C++编程。

在编写c++代码时,有很多常用方法,在stl algorithm中给出了接口,这里简单介绍部分方法。
std::foreach
逐个元素传入函数或类实例,执行相应的操作。

template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function fn)
{
  while (first!=last) {
    fn (*first);
    ++first;
  }
  return fn;      // or, since C++11: return move(fn);
}
// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector
void addfunction (int &i) {  // function:
  i++;
}
void myfunction (int i) {  // function:
  std::cout << ' ' << i;
}

struct myclass {           // function object type:
  void operator() (int &i) {i++;}
} myobject;

int main () {
  std::vector<int> myvector={10,20,30};
  for_each (myvector.begin(), myvector.end(), addfunction);
  for_each (myvector.begin(), myvector.end(), myobject);

  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';

  return 0;
}

std::generate
逐个调用函数或实例,并将返回值赋值给当前位置。

template <class ForwardIterator, class Generator>
  void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
{
  while (first != last) {
    *first = gen();
    ++first;
  }
}
// generate algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::generate
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// function generator:
int RandomNumber () { return (std::rand()%100); }

// class generator:
struct c_unique {
  int current;
  c_unique() {current=0;}
  int operator()() {return ++current;}
} UniqueNumber;

int main () {
  std::srand ( unsigned ( std::time(0) ) );

  std::vector<int> myvector (8);

  std::generate (myvector.begin(), myvector.end(), RandomNumber);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::generate (myvector.begin(), myvector.end(), UniqueNumber);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';
 
  return 0;
}

std::sort
数组排序,默认为升序。

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

std::fill
给数组赋值,可指定范围

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}
// fill algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::fill
#include <vector>       // std::vector

int main () {
  std::vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0

  std::fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
  std::fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

std::merge
合并数组,并排序

// merge algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::merge, std::sort
#include <vector>       // std::vector

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  std::vector<int> v(10);

  std::sort (first,first+5);
  std::sort (second,second+5);
  std::merge (first,first+5,second,second+5,v.begin());

  std::cout << "The resulting vector contains:";
  for (std::vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

std::replace
数组元素替换

// replace algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::replace
#include <vector>       // std::vector

int main () {
  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
  std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

  std::replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

std::count
数组中元素出现的次数

int myints[] = {10,20,30,30,20,10,10,20};   // 8 elements
int mycount = std::count (myints, myints+8, 10);

std::find
数组中查找是否存在某元素,返回查找的指针位置。

  // using std::find with array and pointer:
  int myints[] = { 10, 10, 20, 30, 40 };
  int * p;

  p = std::find (myints, myints+4, 10);
  if (p != myints+4)
    std::cout << "Element found in myints: " << *p << '\n';
  else
    std::cout << "Element not found in myints\n";
### 安装 RabbitMQ Server 3.8.32 on CentOS 7CentOS 7安装特定版本的 RabbitMQ Server(如 3.8.32)可以通过下载官方提供的 `.rpm` 包并使用 `yum` 或 `dnf` 进行安装。以下是详细的步骤: 1. **添加 Erlang Solutions 仓库** RabbitMQ 依赖于 Erlang,因此需要先安装合适的 Erlang 版本。可以使用 Erlang Solutions 提供的仓库来安装 Erlang。 ```bash curl -fsSL https://packages.erlang-solutions.com/rpm/centos/erlang_solutions.asc | sudo rpm --import - echo "deb https://packages.erlang-solutions.com/rpm/centos-7-x86_64/ stable main" | sudo tee /etc/yum.repos.d/erlang-solutions.repo ``` 2. **安装 Erlang** 安装适用于 RabbitMQ 的 Erlang 版本。RabbitMQ 3.8.x 需要 Erlang 21.x 到 23.x 之间的版本。 ```bash sudo yum install -y esl-erlang ``` 3. **下载 RabbitMQ 3.8.32 RPM 包** 可以从 [RabbitMQ 官方网站](https://www.rabbitmq.com/releases/rabbitmq-server/) 下载特定版本的 `.rpm` 包。 ```bash wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.32/rabbitmq-server-3.8.32-1.el7.noarch.rpm ``` 4. **安装 RabbitMQ Server** 使用 `yum` 或 `rpm` 命令安装下载的 `.rpm` 包。 ```bash sudo yum install -y rabbitmq-server-3.8.32-1.el7.noarch.rpm ``` 5. **启动 RabbitMQ 服务** 安装完成后,启动 RabbitMQ 服务并设置为开机自启。 ```bash sudo systemctl enable rabbitmq-server sudo systemctl start rabbitmq-server ``` 6. **启用管理插件** 如果需要使用 Web 管理界面,可以启用管理插件。 ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` 7. **创建管理员用户** 创建一个具有管理权限的用户,并为其分配权限。 ```bash sudo rabbitmqctl add_user admin your_password sudo rabbitmqctl set_user_tags admin administrator sudo rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" ``` 8. **配置防火墙** 如果系统启用了防火墙(如 `firewalld`),需要开放 RabbitMQ 的端口(默认为 5672,管理界面为 15672)。 ```bash sudo firewall-cmd --permanent --add-port=5672/tcp sudo firewall-cmd --permanent --add-port=15672/tcp sudo firewall-cmd --reload ``` 9. **验证安装** 可以通过以下命令检查 RabbitMQ 的状态和集群信息。 ```bash sudo systemctl status rabbitmq-server sudo rabbitmqctl cluster_status ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值