如何将同一行中的值分组为一对?

时间:2014-09-11 09:26:19

标签: c++ data-structures

我正在尝试编写一个程序来读取一个文本文件,该文件具有下面表格中的数据集,并将每行的每2个整数放入一对:

    1    2
    3    4
    5    6
    ... and so on

目前,我的主要代码的这一部分逐行读取文件并将导入的字符串一次转换为一个整数,但我不确定如何在每行中一次分组2个整数并将它们放入在一对。最终,我想将所有对添加到单个集合中。

    while (getline(fs, line))  {
            istringstream is(line); 
                while(is >> line) {                                             
               int j = atoi(line.c_str());
                cout << "j = " << j << endl;}} 

6 个答案:

答案 0 :(得分:1)

您可以简单地使用std::pair,如下所示:

istringstream is(line); 
pair<int, int> p;
is >> p.first;
is >> p.second;
cout << p.first << "  " << p.second;

在下一步中,您可以使用std::set<std::pair<int, int> >来实现将这些对放入单个组中的目标。

答案 1 :(得分:1)

试试这个:

std::ifstream ifs{ "yourfile.txt" };
// read line by line
std::string line;
while(std::getline(ifs, line)) {
    std::istringstream iss{ line }; // make a stream on the line
    auto values = std::make_pair<int, int>(0, 0);
    if(iss >> values.first >> values.second) { // check stream state 
                                               // after reading two ints
                                               // (this skips spaces)
        std::cout << "a=" << values.first << ", b=" << values.second << "\n";
    } else {
        throw std::runtime_error{ "bad data" };
    }

    // at this point, you have read a valid pair of ints into "values"
}

请参阅代码注释以获取解释。

答案 2 :(得分:1)

使用'utility'标题中的可用对,以下是相同的示例代码。

while (getline(fs, line))  
{
     stringstream is;
     is<<test;
     int i, j;
     is>>i;
     is>>j;
     pair<int, int> pr(i,j);
} 

答案 3 :(得分:0)

不要将导入的字符串转换为整数。从一行读取两个字符串并连接它们。然后使它们成为整数。像这样:

#include <sstream>
#include <fstream>
#include <string>
#include <iostream>

using namespace std;    

int main()
{
    string line;
    ifstream fs("input.txt");
    while (getline(fs, line))
    {
        istringstream is(line);
        string num1, num2;

        while (is >> num1 >> num2)
        {
            num1 += num2;
            int j = stoi(num1);
            cout << "j = " << j << endl;
        }
        cin.get();
    }
}

答案 4 :(得分:0)

这样的事情应该适合你的目的。

while (getline(fs, line)) 
{
    istringstream is(line); 
    int i, j;
    is >> i >> j;
    std::pair<int,int> my_pair = std::make_pair (i, j);
}

答案 5 :(得分:0)

以下可能会有所帮助:

std::string line;
std::set<std::pair<int, int>> myset;
while (std::getline(fs, line)) {
    std::istringstream is(line);
    int a, b;
    if (is >> a >> b) {
        myset.insert({a, b});
    } else {
        throw std::runtime_error("invalid data");
    }
}

Live example

要将1, 5视为与5, 1完全相同,您可以使用:

struct unordered_pair_comp
{
    bool operator () (const std::pair<int, int>& lhs, const std::pair<int, int>& rhs) const
    {
        return std::minmax(lhs.first, lhs.second) < std::minmax(rhs.first, rhs.second);
    }
};

因此myset成为std::set<std::pair<int, int>, unordered_pair_comp> myset;

Live example