C++ 给定myvector.start()和myvector.end(),我希望在不复制数据的情况下创建myvector的只读子集。这有可能吗?怎么可能?

C++ 给定myvector.start()和myvector.end(),我希望在不复制数据的情况下创建myvector的只读子集。这有可能吗?怎么可能?,c++,iterator,containers,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.s

给定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() {
#包括
#包括
使用名称空间std;
模板无效打印向量(常量向量和v){

对于(size_t i=0;i在C++11中,所有容器都获得
cbegin()
cend()
函数,它允许您甚至从非常量容器创建
常量迭代器
s。之后,只需修改算法以接受开始和结束迭代器,就完成了

print_range(data.cbegin()+3, data.cend()-3);
如果您一直使用C++03,您可以使用灯光转发功能将任何对象转换为其
const
版本:

template<class T>
T const& as_const(T const& v){ return v; }
只需使用迭代器(适当时使用常量迭代器)

如果你真的对周围的开始/结束对过敏,请考虑使用或类似的东西:它让你把<代码> [开始,结束] < /Cord>配对变成一个单一的对象。

或者是声明所有函数的解决方案,如f(const-vector::iterator&start,const-vector::iterator&en)

STL算法可以做到这一点,对吗?(但是通用的)


是的。一般也这样做。标准库算法是一个很好的建模示例。

提升范围将接近您的预期

下面的示例显示了一个

  • 使用切片适配器创建向量的子范围“视图”(无副本)
  • 显示修改原始(基础)向量元素会导致该视图中的数据发生更改
  • 使用
    make_iterator_range
    执行大致相同的操作
请注意,与简单的迭代器范围相比,它是一个更灵活的抽象

#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <vector>

using namespace boost::adaptors;

int main(int argc, const char *argv[])
{
    std::vector<int> v { 0, 1, 2, 3, 4, 5, 6 };

    auto output = std::ostream_iterator<int>(std::cout, ",");

    auto&& slice = v | sliced(2, 5);

    boost::copy(slice, output); 
    std::cout << '\n';

    v[3] += 10;

    boost::copy(slice, output); 
    std::cout << '\n';

    /// Alternative without adaptors:

    auto range = boost::make_iterator_range(v.begin()+3, v.end());

    boost::copy(range, output); 
    std::cout << '\n';
}

您的
子类型
不是只读的,因为可以使用迭代器修改向量元素。您可以通过返回
常量迭代器
来解决这个问题。但是您最好查看Boost.Range。
切片
允许修改范围。需要一个额外的变量tho,在这种情况下,他也可以ave done
std::vector const&cdata=data;print_range(cdata.begin(),cdata.end());
::好吧,那么我可能看不出操作的目的是什么。为completeness添加迭代器范围示例这看起来很有希望,我会研究一下。
    std::cout << "Bye!" << std::endl;
    return 0;
}
print_range(data.cbegin()+3, data.cend()-3);
template<class T>
T const& as_const(T const& v){ return v; }
print_range(as_const(data).begin()+3, as_const(data).end()-3);
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <vector>

using namespace boost::adaptors;

int main(int argc, const char *argv[])
{
    std::vector<int> v { 0, 1, 2, 3, 4, 5, 6 };

    auto output = std::ostream_iterator<int>(std::cout, ",");

    auto&& slice = v | sliced(2, 5);

    boost::copy(slice, output); 
    std::cout << '\n';

    v[3] += 10;

    boost::copy(slice, output); 
    std::cout << '\n';

    /// Alternative without adaptors:

    auto range = boost::make_iterator_range(v.begin()+3, v.end());

    boost::copy(range, output); 
    std::cout << '\n';
}
2,3,4,
2,13,4,
13,4,5,6,