不可变向量的不可变子向量

Immutable sub vector of immutable vector

本文关键字:不可变 向量      更新时间:2023-10-16

假设我有一个const vector<string>,里面有一些元素,我想创建这个向量的const子集,我该怎么做呢?

理想情况下,如果c++支持像下面这样的代码会很酷,不幸的是它没有。有人知道变通的办法吗?

#include <fstream>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    ifstream infile("input.txt"); // contains apple, orange, banana in separate lines
    istream_iterator<string> eos;
    istream_iterator<string> input(infile);
    const vector<string> stuff(input, eos);
    const vector<string> a_stuff(stuff.copy_if([](const string& s) { return s[0] == 'a'; }));
    return 0;
}

假设您想要复制包含子集的副本,您可以使用函数并将结果分配给const vector<T>

#include <vector>
#include <algorithm>
#include <iterator>
template <typename T, typename Pred>
std::vector<T> vector_copy_if(std::vector<T> const & vec, Pred && pred)
{
  std::vector<T> result;
  std::copy_if(vec.begin(), vec.end(), std::back_inserter(result), pred);
  return result;
}

int main()
{
  std::vector<int> const some_numbers { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  std::vector<int> const even_numbers = vector_copy_if(some_numbers, [](int x) { return x % 2 == 0; });
}

也可以使用boost::filter_iterator来实现相同的结果:

#include <vector>
#include <string>
#include <boost/iterator/filter_iterator.hpp>
using namespace std;
int main()
{
    const vector<string> v {"apple", "banana", "orange"};
    auto filter= [] (string s){return s.length() > 0 && s[0] == 'a';};
    auto start = boost::make_filter_iterator(filter, v.begin(), v.end());
    auto end   = boost::make_filter_iterator(filter, v.end(), v.end());
    const vector<string> cv (start, end);
}