C ++中的向量:为什么我为这个简单的副本而得到了很多错误。打印程序?

时间:2012-08-16 06:50:58

标签: c++ c++11 vector stl iteration

我正在尝试使用算法lib&向量lib首先将一组数字从一个数组复制到一个向量中然后使用迭代打印它,我的代码问题在哪里?

并且有一件事是我首先使用vec.begin()选择2种方式来完成此迭代; vec.end()方法&另一个是(i = 0; i< vec.capacity(); i ++) 两者都面临着错误。

我该怎么办?

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int intArray[] = {5,6,8,3,40,36,98,29,75};

    vector<int> vecList(9);
    //vector<int>::iterator it;
    copy (intArray, intArray+9,vecList);
    //for(it  = vecList.begin() ; it != vecList.end() ; it++)
    for (int it = 0 ; it < vecList.capacity() ; it++)
    {
        cout<<*it<<endl;
     }

    system("pause");
    return 0;

}

5 个答案:

答案 0 :(得分:7)

可能会有一些改进。

您将迭代器与索引混淆。迭代器it是指向矢量的美化指针,您需要通过键入*it来解除反射。索引i是从向量开头的偏移量,并且vecList[i]将为您提供该元素。

矢量的初始化最好使用初始化列表(C ++ 11)完成,而不是从数组中读取。

您需要循环到vecList.size()。向量的容量是向量容器的元素的已分配存储空间的大小。循环最好使用范围为for循环,如Kerrek SB,或std::for_each + lambda表达式,或常规for循环所示。但是,在这种情况下,最好养成做it != vecList.end()(而不是使用<)并执行++it而不是it++的习惯。

请注意,我还使用auto来避免编写显式迭代器类型。在任何地方使用auto都是一个好习惯。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    // initialize vector with a list of elements
    vector<int> vecList {5,6,8,3,40,36,98,29,75}; 

    // loop from begin() to end() of vector, doing ++it instead of it++ 
    for (auto it = vecList.begin(); it != vecList.end(); ++it) 
    {
        cout<<*it<<endl;
    }

    // the pause command is better done by setting a breakpoint in a debugger

    return 0;

}

Ideone上的输出(这使用g ++ 4.5.1编译器,最好升级到至少那个版本以利用C ++ 11的功能)。

答案 1 :(得分:6)

问题在于您混淆了索引和迭代器。

w / index:

 for (int i = 0  ; i < vecList.size() ; it++)
 {
    cout<<vecList[i]<<endl;
 }

w / iterators

 for (std::vector<int>::const_iterator it = vecList.begin()  ; i != vecList.end() ; it++)
 {
    cout<<*it<<endl;
 }

答案 2 :(得分:1)

一个。你需要迭代vecList.size()而不是vecList.capacity(),这意味着向量为自己保留了多少内存(而不是有多少内存在使用中)。
B.您尝试使用整数索引it作为迭代器并调用*it,您应该检查Luchian Grigore的答案是否正确。

答案 3 :(得分:1)

这不是一个答案,但我想展示现代C ++如何让您消除对细节的许多脆弱依赖:

int intArray[] = {5,6,8,3,40,36,98,29,75};

std::vector<int> vecList(std::begin(intArray), std::end(intArray));

for (int i : vecList) { std::cout << i << std::endl; }

以惯用方式使用迭代器和算法,您通常可以删除任何明确提及的详细信息,例如数组的长度,从而使您的代码更加健壮。

答案 4 :(得分:1)

错字使用:复制(intArray,intArray + 9,vecList.begin());

所以,

#include<iostream>
#include<vector>
#include <algorithm>

using namespace std;


int main()

{

int intArray[] = {5,6,8,3,40,36,98,29,75};

vector<int> vecList(9);
vector<int>:: iterator it;
copy (intArray, intArray+9,vecList.begin());
for (it=vecList.begin();it!=vecList.end(); it++)
{
    cout<<*it<<endl;
 }

system("pause");
return 0;

}