如何访问在 C++ 中通过引用传递的列表/向量的元素

Posted

技术标签:

【中文标题】如何访问在 C++ 中通过引用传递的列表/向量的元素【英文标题】:How to access the element of a list/vector that passed by reference in C++ 【发布时间】:2011-06-05 16:38:32 【问题描述】:

问题是通过引用传递列表/向量

   int main()
        list<int> arr;
        //Adding few ints here to arr
        func1(&arr);   
        return 0; 
    

    void func1(list<int> * arr)
     // How Can I print the values here ?

     //I tried all the below , but it is erroring out.
     cout<<arr[0]; // error
     cout<<*arr[0];// error
     cout<<(*arr)[0];//error

     //How do I modify the value at the index 0 ?

     func2(arr);// Since it is already a pointer, I am passing just the address
     

     void func2(list<int> *arr)

     //How do I print and modify the values here ? I believe it should be the same as above but 
     // just in case.
     

向量与列表有什么不同吗?提前致谢。

任何详细解释这些内容的链接都会有很大帮助。再次感谢。

【问题讨论】:

这甚至无法编译。 @prasoon :cmets 中的错误意味着编译时错误。关于如何以正确/正确的方式处理它的任何解决方案? 我的意思是除了提到的错误之外,代码还有一些错误。缺少 mainfunc1func2 的返回类型。 main 应该返回一个 int 我实际上主要是在使用 [] 运算符。但我刚刚发现它仅适用于矢量而不适用于列表。谢谢大家。 @bsoundra: 嗯,它是通过指针传递的,的引用,但是如果你传递 NULL 等会发生什么。如果你传递一个真正的引用,那么你不必担心 NULL 或类似的东西。有关详细信息,请参阅此:***.com/questions/3224155/… 【参考方案1】:

您不是通过引用传递list,而是通过指针传递。在“C talk”中两者是相等的,但是由于C++中有引用类型,区别就很明显了。

要通过引用传递,请使用 & 代替 * - 并“正常”访问,即

void func(list<int>& a) 
    std::cout << a.size() << "\n";

要通过指针传递,您需要用星号取消引用指针(并注意运算符的存在),即

void func(list<int>* arr) 
    std::cout << (*a).size() << "\n"; // preferably a->size();

std::list 中没有operator[]

【讨论】:

【参考方案2】:
   //note the return type also!
   void func1(list<int> * arr)
   
    for (list<int>::iterator i= arr->begin() ; i!= arr->end(); i++ )
    
          //treat 'i' as if it's pointer to int - the type of elements of the list!
          cout<< *i << endl;
    
   

在您的示例中,未指定 func1() 的返回类型。所以我指定了它。您可以从 void 更改为其他类型。也不要忘记为func2()main() 指定返回类型。


如果你想使用下标运算符[],那么你必须使用std::vector&lt;int&gt;,因为list&lt;&gt; 不会重载operator[]。在这种情况下,你可以写:

for(std::vector<int>::size_type i = 0 ; i < arr->size() ; i++ )

    cout << (*arr)[i] << endl;

我仍然假设arr 是指向vector&lt;int&gt; 的指针。

也许,您想稍微修改一下您的代码,如下所示:

   void func1(vector<int> & arr) // <-- note this change!
   
         for(std::vector<int>::size_type i = 0 ; i < arr.size() ; i++ )
         
                cout << arr[i] << endl;
         
   

【讨论】:

以上是关于如何访问在 C++ 中通过引用传递的列表/向量的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中通过引用返回向量

C++ 11 可以在不同线程中通过引用安全地传递和访问 std::atomics

在 C++ 中通过引用/值传递

在 C++ 中通过引用传递对象

在 C++ 中通过引用传递时参数的默认值

有人可以解释在 C++ 中通过指针传递和通过引用传递的目的是啥吗?