c++ - 鉴于 myvector.start() 和 myvector.end() 我想创建 myvector 的只读子集而不复制数据。这可能吗?如何实现?

标签 c++ iterator containers

给定 myvector.start() 和 myvector.end() 我想在不复制数据的情况下创建 myvector 的只读子集

这可能吗?如何实现?

#include <iostream>
#include <vector>

using namespace std;

template <class T> void print_vector(const vector<T> &v) {
    for(size_t i = 0; i < v.size(); ++i) std::cout << v[i] << " ";
    std::cout << std::endl;
}

int main() {

首先我创建 vector 。

    vector<double> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    print_vector(data); // 1 2 3 4 5 6 7 8 9 10

然后我想要一个子集。但我认为这是复制。

    // Does this make a copy or not? I don't want to make a copy.
    const vector<double> subset1(data.begin() + 3, data.end() - 3);
    print_vector(subset1); // 4 5 6 7

这种方法怎么样?

    // Another approach. Questions:
    // - Would something like this be a good alternative if I really don't want a copy?
    // - How would the performance of this be compared to a normal STL container?
    // - Is there an existing implementation of a container that does something like this, maybe a boost class?
    class SubsetType {
    public:
        SubsetType(const vector<double>::iterator &start, const vector<double>::iterator &end) { begin_ = start; end_ = end; }

        vector<double>::iterator begin() { return begin_; }
        vector<double>::iterator end() { return end_; }

        double operator[](vector<double>::size_type i) { return *(begin_ + i); }

        vector<double>::size_type size() { return end_ - begin_; }

    private:
        vector<double>::iterator begin_, end_;
    };

    SubsetType subset2(data.begin() + 3, data.end() - 3);
    for(size_t i = 0; i < subset2.size(); ++i) std::cout << subset2[i] << " ";
    std::cout << std::endl; // 4 5 6 7

或者是声明所有函数的解决方案,如 f(const vector::iterator &start, const vector::iterator &en)。 STL 算法就是这样做的,对吗? (但通用)

退出

    std::cout << "Bye!" << std::endl;
    return 0;
}

最佳答案

只需使用迭代器(适当时使用常量迭代器)。

如果您真的对到处传递开始/结束对过敏,请考虑使用 Boost.Range或类似的东西:它允许您将 [start,end) 对捆绑到一个对象中。

关于c++ - 鉴于 myvector.start() 和 myvector.end() 我想创建 myvector 的只读子集而不复制数据。这可能吗?如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849386/

相关文章:

c++ - lambda 采用 `char` 参数

c++ - C/GCC 中可重复的全局声明

c++ - 帮助 map C++

java - 如何在某些源上创建并发迭代器?

c++ - 输入迭代器 + 输出迭代器 + X = 前向迭代器

c++ - 将迭代器 <A> 转换/映射到迭代器 <B>

set - D中的简单集实现?

Windows docker 容器无法 ping 主机

c++ - 为什么容器分配器内部的 sizeof(T) 与单独分配器中的不同?

c++ - 无法包装 std::istream,移动后 unique_ptr 不为空