繁体   English   中英

C ++如何使用两个迭代器从向量复制范围

[英]c++ how to copy range from vector using two iterators

我有以下示例代码无法编译:

#include <iostream>
#include <vector>

using std::endl; using std::cin; using std::cout;
using std::vector;


int main()
{
    vector<int> vi, seg;
    vi.push_back(3);
    vi.push_back(4);
    vi.push_back(5);
    vi.push_back(6);
    vi.push_back(7);
    vector<int>::const_iterator ci_start = vi.begin();
    vector<int>::const_iterator ci_actual = vi.begin();
    while (ci_actual != vi.end())
    {   
        seg = vi(ci_start, ci_actual);
        cout << "......" ;
        for (const vector<int>::const_iterator ci = vi.begin();
                                    ci != vi.end(); ++ci)
            cout << *ci << " ";
        cout << endl;

        ++ci_actual;
    }   
}

我想要的是将向量vi递增部分(将要花费数百万个元素)传递给一个函数(未显示)。 vi的开始到目前的actual位置,都考虑了这些段。
为此,我声明了应该包含vi一部分的seg

所需的输出为:

3
3 4
3 4 5
3 4 5 6 3 4 5 6 7

seg是否不应该保存由迭代器ci_startci_actual表示的vi元素的副本?

要将vi不断增加的部分传递给我引用的函数(不存在),我可以更快地做到这一点,而无需将vi的元素复制到另一个向量,而仅将引用传递给vi吗?

for (const vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)

您在这里声明const const_interator。 意思是当您尝试调用++ ci时,编译器会对您尝试修改常量变量大喊大叫。 这应该修复该编译器错误:

for (vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)

如果您遇到编译器错误,请告诉我们它是什么。 看起来像这样:

  seg = vi(ci_start, ci_actual);

应该

  vector<int> seg(ci_start, ci_actual);

并删除main()顶部的seg声明。

如果要打印段,您的for循环应使用seg.begin()/ seg.end()

回复:关于如何调用要在大向量的子范围上进行操作的辅助函数的后续问题...

首先, 这个stackoverflow问题可能有用。 公认的“只需通过一对迭代器”答案就是我要建议的。

其次,如果可以使用Boost库,则矢量代理库可能会很有用。

int main()
{
    vector<int> vi;

    vi.push_back(3);
    vi.push_back(4);
    vi.push_back(5);
    vi.push_back(6);
    vi.push_back(7);

    //the end of the sequence 
    vector<int>::iterator seq_end = vi.begin() + 1;

    while (seq_end != vi.end())
    {
        cout << "......" ;
        for (vector<int>::iterator ci = vi.begin(); ci != seq_end; ++ci)
            cout << *ci << " ";
        cout << endl;

        any_function(vi.begin(), seq_end);

        ++seq_end;
    }   
}

void any_function(const vector<int>::iterator& seq_start,
                  const vector<int>::iterator& seq_end)
{
    ...
}

这段代码可以做到,分析并修复您的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM