C++ - split, join, replace_all, brent_find_minima

출처

split

지정한 구분 문자로 문자열을 분할 할 때는 boost::algorithm::split 함수를 사용한다.
얻어진 결과는 지정한 컨테이너에서 받는다.
구분 문자인지 판정하는 것은 boost::is_any_of를 사용한다.
아래 예는 문자열을 + 로 구분하고 있다.
split(plus_split_s, s, [](char c){return c == '+';});

#include <bits/stdc++.h>
#include <boost/algorithm/string/classification.hpp> // is_any_of
#include <boost/algorithm/string/split.hpp>

using namespace std;
using boost::algorithm::split;

int main() {
  string s;
  cin >> s;
  vector<string> plus_split_s;
  split(plus_split_s, s, boost::is_any_of("+"));
  int cnt = 0;
  for (const string& elem : plus_split_s) {
    if (elem.find('0') == string::npos) ++cnt;
  }
  cout << cnt << endl;
}

boost::algorithm::join

컨테이너의 문자열을 연결해서 하나의 문자열로 만들 때는 boost::algorithm::join 함수를 사용한다.
연결하는 문자열에 구분자를 지정할 수 있고, 아래는 _ 를 구분자로 하였다.
string s = join(arr, "_");

#include <bits/stdc++.h>
#include <boost/algorithm/string/join.hpp>

using namespace std; 
using boost::algorithm::join;

int main() {
  int n, l;
  cin >> n >> l;
  vector<string> arr(n);
  for (int i = 0; i < n; ++i) {
    cin >> arr[i];
  }
  sort(arr.begin(), arr.end());
  string s = join(arr, "");
  cout << s << endl;
}

boost::algorithm::replace_all

문자열 중의 요소를 모두 다른 요소로 치환할 때는 boost::algorithm::replace_all 함수를 사용한다.
이것을 원본을 변경한다.
원본을 변경하지 않을 때는 boost::algorithm::replace_all_copy 함수를 사용한다.
string result = boost::algorithm::replace_all_copy(s, "AtCoder", "A");

#include <bits/stdc++.h>
#include <boost/algorithm/string/replace.hpp>

using namespace std;
using boost::algorithm::replace_all;

int main() {
  string s;
  getline(cin, s);
  replace_all(s, "Left", "<");
  replace_all(s, "Right", ">");
  replace_all(s, "AtCoder", "A");
  cout << s << endl;
}

boost::math:: tools::brent_find_minima

함수의 최소 값을 찾을 때는 boost::math::tools::brent_find_minima 함수를 사용한다.

#include <bits/stdc++.h>
#include <boost/math/tools/minima.hpp>

using namespace std;
using boost::math::tools::brent_find_minima;

int main() {
  double p;
  cin >> p;
  auto r = brent_find_minima([p](double x) {return x + p / pow(2.0 , x / 1.5);}, 0.0, 100.0, 30);
  cout << fixed << setprecision(15);
  cout << r.second << endl;
}

이 글은 2020-03-06에 작성되었습니다.