c ++如何使用两个迭代器从vector复制范围

时间:2010-12-30 16:21:02

标签: c++ vector iterator copy

我有这个不编译的示例代码:

#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所在的地方考虑这些细分 为此,我宣布seg应该是vi的一部分。

所需的输出将是:

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

seg不应该包含迭代器vici_start所表示的ci_actual元素的副本吗?

要将vi中不断增加的部分传递给我所提到的函数(缺席),我可以更快地完成它而不将vi的元素复制到另一个向量并只传递对段的引用是vi

4 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:2)

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

  seg = vi(ci_start, ci_actual);

应该是

  vector<int> seg(ci_start, ci_actual);

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

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

答案 2 :(得分:1)

Re:关于如何调用你想在大型向量的子范围内操作的辅助函数的后续问题......

首先,this stackoverflow question可能有用。接受的“只是传递一对迭代器”的回答正是我要提出的建议。

其次,如果您可以使用增强库,vector proxy libraries可能会有用。

答案 3 :(得分:0)

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)
{
    ...
}

此代码可以制作,分析和修复您的错误。