如何在函数中访问向量的不同成员

Posted

技术标签:

【中文标题】如何在函数中访问向量的不同成员【英文标题】:How to access different members of vector in a function 【发布时间】:2011-11-22 22:17:35 【问题描述】:
#include <vector>

int main()

   vector <class> abc;

当按下某个键时

vector.push_back(class());

每个循环

draw(vector)// what should the parameters be?

绘制函数

draw(vector,sizeofvector)

    for (int x=0;x< sizeofvector;x++)
    draw vector[x];

参数应该如何显示?我应该传递一个 *abc 吗?

【问题讨论】:

class 是 C++ 中的关键字。它永远无法命名类型。 【参考方案1】:

在现代 C++ 中,可以在不纠正错误的情况下回答这个问题:

for (const auto & x : vector)  draw(x); 

或者(仍在 C++11 中):

for (auto it = vector.cbegin(), end = vector.cend(); it != end; ++it)

  draw(*it);

这可能也适用于 C++98/03:

for (std::size_t i = 0, end = vector.size(); i != end; ++i)  draw(vector[i]); 

【讨论】:

你不能在 C++98/03 中做 i=0, ie=vector.size() 吗?每次迭代都调用函数听起来并不有趣。 @MichaelKrelin-hacker:你可以! :-)【参考方案2】:

如果你不打算修改向量,你通常通过 const 引用来传递它。

void draw(const std::vector<T>& v)

    for (int x = 0; x < v.size(); x++)
    
        // draw v[x];
    

您也可以使用迭代器(这通常更可取)。

void draw(const std::vector<T>& v)

    for (std::vector<T>::const_iterator x = v.begin(); x != v.end(); ++x)
    
        // draw *x;
    

您不按值传递它的原因 (draw(std::vector&lt;T&gt; v)) 是因为这会导致每次调用函数时都复制整个向量,这显然是非常低效的。引用意味着您只是引用现有向量而不是创建新向量。

【讨论】:

iterators 只是 STL 中的基本粘合剂。 auto 使迭代器的输入更加方便。【参考方案3】:

std::vector 是类型。您需要传入一个实例,因此在您的情况下:

draw(abc);

我也同意你的函数应该有原型:

void draw( const std::vector<class> & v );

【讨论】:

【参考方案4】:
#include <algorithm>
#include <vector>
#include <iostream>

void addOne(int& value)

    value++;


void print(int& value)

    std::cout << value;


int main()

    std::vector<int> myVector;
    myVector.push_back(1);
    myVector.push_back(2);
    myVector.push_back(3);
    std::for_each(myVector.begin(), myVector.end(), addOne);
    std::for_each(myVector.begin(), myVector.end(), print);

输出:234

手工编写,可能出现编译错误

【讨论】:

以上是关于如何在函数中访问向量的不同成员的主要内容,如果未能解决你的问题,请参考以下文章

如何访问和存储向量类型的结构成员?

如何访问 std::vector 类型的成员

如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

如何在 C++ 中访问类对象向量中的对象?

如何允许访问向量是类成员的向量元素?

在 Kotlin 中如何从不同的模块访问内部成员