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

C++ c++;如何使用两个迭代器从向量复制范围,c++,vector,iterator,copy,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.

我有一个未编译的示例代码:

#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;
    }   
}
#包括
#包括
使用std::endl;使用std::cin;使用std::cout;
使用std::vector;
int main()
{
向量vi,seg;
vi.推回(3);
vi.推回(4);
vi.推回(5);
vi.推回(6);
vi.推回(7);
向量::常量迭代器ci_start=vi.begin();
vector::const_迭代器ci_actual=vi.begin();
while(ci_实际值!=vi.end())
{   
seg=vi(ci_开始,ci_实际);

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

  seg = vi(ci_start, ci_actual);
应该是

  vector<int> seg(ci_start, ci_actual);
矢量seg(ci_开始,ci_实际);
并删除main()顶部的seg声明


for循环应该使用seg.begin()/seg.end()。如果要打印段

如果出现编译器错误,请告诉我们它是什么。它如下所示:

  seg = vi(ci_start, ci_actual);
for (const vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)
应该是

  vector<int> seg(ci_start, ci_actual);
矢量seg(ci_开始,ci_实际);
并删除main()顶部的seg声明

如果要打印(const vector::const_iterator ci=vi.begin();ci!=vi.end();++ci)的段,for循环应该使用seg.begin()/seg.end()
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)
for(vector::const_迭代器ci=vi.begin();ci!=vi.end();++ci)
for(常量向量::常量迭代器ci=vi.begin();ci!=vi.end();++ci)
您在此处声明了一个const const_interator。这意味着,当您试图调用++ci时,编译器会因为您试图修改常量变量而对您大喊大叫。这将修复编译器错误:

for (vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)
for(vector::const_迭代器ci=vi.begin();ci!=vi.end();++ci)
int main()
{
向量vi;
vi.推回(3);
vi.推回(4);
vi.推回(5);
vi.推回(6);
vi.推回(7);
//序列的结尾
向量::迭代器seq_end=vi.begin()+1;
while(seq_end!=vi.end())
{
cout
intmain()
{
向量vi;
vi.推回(3);
vi.推回(4);
vi.推回(5);
vi.推回(6);
vi.推回(7);
//序列的结尾
向量::迭代器seq_end=vi.begin()+1;
while(seq_end!=vi.end())
{

coutRe:接下来的问题是如何调用要在大向量的子范围上操作的辅助函数

首先,可能是有用的。被接受的“只需传递一对迭代器”答案正是我要建议的


其次,如果您可以使用boost库,则可能会很有用。

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

首先,可能是有用的。被接受的“只需传递一对迭代器”答案正是我要建议的


第二,如果您可以使用boost库,则可能有用。

好吧,有两个错误,您解决了一个。谢谢。但我仍然得到:ex.cpp:23:error:passing'const\u gnu\u cxx::\u normal\u iterator'作为'u\u gnu cxx::\u normal\u iterator&\u gnu cxx:::\u normal\u iterator::operator++(运算符++)[with _Iterator=const int*,_Container=std::vector]'丢弃可能由于
seg=vi(ci_start,ci_actual)而导致的限定符
Lou在下面指出的行。有两个错误,你解决了一个。谢谢。但我仍然得到:ex.cpp:23:error:passing'constgnu cxx::normaliterator'作为'的'this'参数::normaliterator&gnu cxx::::normal iterator::operator++()[withiterator=const int*,Container=std]'丢弃可能由于您的
seg=vi(ci_开始,ci_实际)而导致的限定符
行@Lou在下面指出。在for循环中从向量声明中删除
常量后,我再次尝试了你的建议,编译器不再抱怨了。似乎在while循环中继续重新声明向量seg没有问题。变量不应该只声明一次吗?它只是declared一次。循环没有一直声明它——它一直在构造它,但这没关系,因为每次迭代都需要不同的seg。在for循环中从向量声明中删除
const
后,我再次尝试了你的建议,编译器不再抱怨了。似乎保持重新声明没有问题在while循环中声明vector seg。变量不应该只声明一次吗?它只声明一次。循环不会一直声明它——它会一直构造它,但这没关系,因为每次迭代都需要一个不同的seg。嗨,我问的不完全是这个。假设vector
vi
有1000万个元素。作为状态在上面的d中,在while循环的每次迭代中,我希望将
vi
中的元素作为参数传递,等等。我的问题是:我真的需要为此创建向量seg吗?如果需要,我需要在每次迭代中将元素从
vi
复制到
seg
,这很昂贵。或者我可以将指针传递到
vi
,以避免复制?或者其他解决方案?那么你不需要seg,只需将vi作为常量引用发送给你,什么我问的不完全是这个。假设向量
vi
有1000万个元素。如上所述,在while循环的每次迭代中,我想将
vi
中的元素作为参数传递。在第一次迭代中:1个元素;在第二次迭代中,两个元素(1st e 2nd),等等。我的问题是:我真的需要为此创建向量seg吗?如果需要,我需要在每次迭代中将元素从
vi
复制到
seg
,这很昂贵。或者我可以传递指向
vi
的指针以避免复制?或者其他解决方案?那么