微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打印 std::vector<std::pair>

如何解决打印 std::vector<std::pair>

我想打印向量 dicVec 以检查是否一切都如我所愿。但我不能。我已经查过了,但没有任何帮助。

这是我当前的代码

void Translate::read(){
    int i = 0;

    std::ifstream dic("ende.dic");
    if (dic.is_open())
    {
        std::string dicLine;
        while (std::getline(dic,dicLine)){
            std::vector<std::pair<std::string,std::string>> dicVec;
            std::pair<std::string,std::string> dicPair;
            std::size_t pos = dicLine.find(";");
            dicPair.first = dicLine.substr(0,pos);
            //std::cout << dicPair.first << " : ";
            dicPair.second= dicLine.substr(pos+1);
            //std::cout << dicPair.second << std::endl;
            std::cout << dicVec[i];
            i++;
        }
    }
    else {
        throw std::runtime_error("File Could not be opened");
    }
}

我也尝试使用这个打印它:

std::cout << dicVec.at(i);

还有这个:

for (auto i = dicVec.begin(); i != dicVec.end(); ++i)
    std::cout << *i << ' ';

但总是有这个错误

no match for operator<<

我需要做什么才能打印我的矢量? 感谢您的帮助。

解决方法

您正在尝试打印出一个 std::pair,但没有为 operator<< 实现标准的 std::pair,因此您必须自己编写。

即使您修复了该问题,您的代码仍然会失败,因为当您调用 dicVecstd::cout << dicVec[i]; 为空 您没有在打印内容之前将 dicPair 添加到 dicVec dicVec。事实上,dicVec 应该声明在循环的上方,而不是内部

尝试更像这样的事情:

typedef std::pair<std::string,std::string> stringPair;
typedef std::vector<stringPair> stringPairVec;

std::ostream& operator<<(std::ostream &out,const stringPair &p) {
    out << p.first << " : " << p.second << "\n";
    return out;
}

std:ostream& operator<<(std::ostream &out,const stringPairVec &vec) {
    for (size_t i = 0; i < vec.size(); ++i) {
        out << vec[i];
    }
    return out;
}

void Translate::read(){

    std::ifstream dic("ende.dic");
    if (!dic.is_open()) {
        throw std::runtime_error("File could not be opened");
    }

    stringPairVec dicVec;
    std::string dicLine;

    while (std::getline(dic,dicLine)) {
        std::size_t pos = dicLine.find(";");
        stringPair dicPair = std::make_pair(
            dicLine.substr(0,pos),dicLine.substr(pos+1)
        );
        dicVec.push_back(dicPair);
    }

    std::cout << dicVec;
}

或者,在 C++11 及更高版本中,您可以改为这样做:

using stringPair = std::pair<std::string,std::string>;
using stringPairVec = std::vector<stringPair>;

std::ostream& operator<<(std::ostream &out,const stringPairVec &vec) {
    for (const auto &p : vec) {
        out << p;
    }
    return out;
}

void Translate::read(){

    std::ifstream dic("ende.dic");
    if (!dic.is_open()) {
        throw std::runtime_error("File could not be opened");
    }

    stringPairVec dicVec;
    std::string dicLine;

    while (std::getline(dic,dicLine)) {
        std::size_t pos = dicLine.find(";");
        dicVec.emplace_back(
            dicLine.substr(0,dicLine.substr(pos+1)
        );
    }

    std::cout << dicVec;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。