【问题标题】: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++ 中的关键字。它永远无法命名类型。

标签: c++ vector reference


【解决方案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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      相关资源
      最近更新 更多