过载运算符<<对于指针的向量结构?

时间:2017-12-06 15:13:20

标签: c++ vector struct operator-overloading

我目前正在尝试为我的结构向量创建overload operator<<,这样我将以矩阵格式打印向量的内容。

这是我到目前为止所尝试的

// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>

struct element
{
    std::vector<int> keys;
    std::string item;

    element(std::vector <int> key, std::string item)
    {
        keys = key;
        this->item = item;        
    }

};


inline std::stream operator << (std::ostream &stream, const std::vector<element*> _element)
{
    for (auto elements: _element)
    {
        for(auto item : elements)
        {
            std::stream << item.key << " "
        }
    }

}


int main()
{
    std::cout << "Hello, Wandbox!" << std::endl;
    std::vector<element> storage;
    std::vector<int> test(10);
    std::generate(test.begin(), test.end(), []() {
    return rand() % 100;
});
    std::string name = "test";
    storage.push_back(element(test,name));
    std::generate(test.begin(), test.end(), []() {
    return rand() % 100;
});
    storage.push_back(element(test,name));
    std::generate(test.begin(), test.end(), []() {
    return rand() % 100;
});
    storage.push_back(element(test,name));

    std::vector<element*> copy_of_storage;
    for(auto elements: storage)
    {
        copy_of_storage.push_back(&(elements));
    }


    std::cout << copy_of_storage << std::endl; 

}

但由于某种原因它无法正常工作,似乎无法理解出现了什么问题?

https://wandbox.org/permlink/BQpqmz0HwoXgyS7t

2 个答案:

答案 0 :(得分:1)

您的运营商&lt;&lt;。

中存在许多错误

首先,你的返回类型应该是std :: ostream&amp;因此你必须返回流。在你的第二个循环中:

    for(auto item : elements)

元素是元素的指针(向量的值类型),因此您无法迭代其他元素,您可能想要迭代其他元素 - &gt;键

这是你的固定功能:

inline std::ostream& operator<< (std::ostream &stream, const  std::vector<element*> _element)
{
    for (auto elements: _element)
        for(auto item : elements->keys)
            stream << item << " ";
    return stream;
}

https://wandbox.org/permlink/qNYVx2yMg7L76NWe

答案 1 :(得分:1)

您可以采取一些措施来修复代码示例 - 更好的命名约定将是一个重要的开始。

您的代码无效的原因是您的运营商&lt;&lt;功能。以下内容适用:

std::ostream& operator << (std::ostream &stream, std::vector<element*> _elements)
{
    for (auto element : _elements)
    {
        for(auto item : element->keys)
        {
            stream << item << " ";
        }
    }
    return stream;
}

您的工作示例:https://wandbox.org/permlink/FVXbLlXEAJpVbfAx

此外:

  • 重构您的代码 - 更好的变量名称。
  • 尝试在元素构造函数中使用成员初始化列表。 并且值得将ctor params改为const&amp;。
  • operator&lt;&lt;应该返回一个std :: ostream&amp;。
  • 删除内联关键字
  • operators <<参数列表中,您可以从const中删除std::vector<element*>,因为它是包含非常量指针的向量的副本。