3

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

有一件事是我选择了两种方法首先使用 vec.begin() 进行迭代;vec.end() 方法和另一个是 for (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;

}
4

5 回答 5

7

有几个可能的改进。

您将迭代器与索引混淆。迭代器it是指向向量的美化指针,您需要通过键入来取消引用*it。索引i是从向量开头的偏移量,说vecList[i]会给你那个元素。

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

你需要循环到vecList.size(). 向量的容量是为向量容器的元素分配的存储空间的大小。循环最好用一个 ranged-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 功能)。

于 2012-08-16T06:52:14.097 回答
6

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

带索引:

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

带迭代器

 for (std::vector<int>::const_iterator it = vecList.begin()  ; i != vecList.end() ; it++)
 {
    cout<<*it<<endl;
 }
于 2012-08-16T06:53:09.020 回答
1

拼写错误使用:copy (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;

}
于 2012-08-20T04:43:24.183 回答
1

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

于 2012-08-16T06:58:30.533 回答
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; }

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

于 2012-08-16T06:59:15.963 回答