C++:问题向量 STL

Posted

技术标签:

【中文标题】C++:问题向量 STL【英文标题】:C++:questions vector STL 【发布时间】:2016-02-11 06:24:33 【问题描述】:

我确实通过调用名为 getDivisors 的函数来获得除数,并返回由容器 vector<int> 格式化的值。

由于我是 C++ 容器的新手,我尝试使用迭代器通过 for 循环打印除数整数。但是,在我看来,这似乎太复杂了。 有什么简单的方法可以在向量STL 中显示存储的整数吗?

我不明白为什么迭代器变量it is pointer type? Could you explain it more about it? I was confused that the compilers show the error message when I diditnotit`

以下是我的简单代码。

#include <iostream>
#include <vector>
using namespace std;

vector<int> getDivisors(int input)

    vector<int> divisors;
    divisors.push_back(1); //default
    for (int i = 2; i < input; i++)
        if (input%i == 0)
            divisors.push_back(i);
        
    

    return divisors;


void solve()

    int input;
    cin >> input;
    vector<int> divisors = getDivisors(input);

    for (vector<int>::iterator it = divisors.begin(); it != divisors.end(); ++it)
    
        cout << *it << endl;
    



int main(void)

    int num;
    cin >> num;
    for (int i = 0; i < num; i++)
        solve();
    
    return 0;

【问题讨论】:

【参考方案1】:

您没有提到您使用的是哪个编译器,但在符合 C++11 的编译器中,您可以使用 auto 和 Ranged-based for loop

for (auto i : divisors)

    cout << i << endl;

i 这里不是迭代器,它是容器模板类型,在您的情况下是 int

指针是一种iterator,特别是random access iterator。迭代器被设计为带有*-&gt;++-- 等运算符的指针抽象,用于访问containers。

对于 C++ 程序员,cplusplus.com 是您的朋友。

【讨论】:

感谢您的回复。如何在 Visual Studio 中知道我的 C++ 编译器是 C++11 或更低版本? Visual Studio 2013 及以上版本提供 C++11 支持 “范围”是 Visual Studio 2012 中添加的 C++ 11 功能。 或者你也可以看到使用“std::for_each”【参考方案2】:

它不是一个指针,它是一个迭代器。它覆盖operator * 以提供类似指针的行为。您可以阅读有关 C++ STL 的更多信息以了解这一点。

如果您使用的是 C++11 或更高版本,请使用:

for (auto x : divisors) cout << x << endl;

【讨论】:

【参考方案3】:

迭代器是方便的抽象,有助于访问容器。它们不是指针。

您必须注意的一件事是,如果与其关联的容器发生重大变化,迭代器可能会失效

获取一本关于 STL 的好书,并在继续之前掌握基础知识。这是一个入门书,但它只能做这么多。http://www.cprogramming.com/tutorial/stl/iterators.html

【讨论】:

以上是关于C++:问题向量 STL的主要内容,如果未能解决你的问题,请参考以下文章

最小的 C++ STL 向量实现问题

在向量 STL C++ 中查找项目

寻找类似 C++ STL 的向量类但使用堆栈存储

在 C++ 中的向量中查找() stl

使用 C++ 和 STL 的向量元素乘积

如何在 WebAssembly 中使用(C++ STL 的)向量