解析整数列表到矢量或地图或多图?

时间:2015-02-17 20:24:58

标签: c++ boost

我有以下格式的列表:

2323 0 1212
2424 0 1313
2525 1 1414

我需要存储这些值的每一行,我需要能够单独访问它们中的每一行,并且能够搜索存储在我使用的任何数字中的任何数字的出现。

我可以使用什么?我应该使用多个向量还是可以将它们存储在多图或者可能是boost :: tuple?

我不能使用c ++ 11而且我只有有限的助推器支持(安装了1.36,我无法更新)。

我已经有一个可以解析列表的解析器(在那里找到):http://en.highscore.de/cpp/boost/parser.html

提前谢谢

4 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你可以定义一个结构(从评论中取名):

struct Item
{
    int position;
    int direction;
    int nextPosition;
};

然后只有一个std::vector<Item>。该行将是索引。要计算值的出现次数,可以将自定义谓词传递给std::count,或者只是定义自己的函数来执行此操作,因为我认为使用std :: count而不使用C ++ 11 lambdas可能有点困难。

编辑:为了让您更容易,正如Thomas Matthews所建议的那样,您可以重载运算符&gt;&gt;您的结构直接从文件中读取:

struct Item
{
    int position;
    int direction;
    int nextPosition;

    friend std::istream& operator>>(std::istream& stream, Item& item);
};

std::ifstream& operator>>(std::ifstream& stream, Item& item)
{
    stream >> item.position  >> item.direction >> item.nextPosition;

    return stream;
}

答案 1 :(得分:0)

这取决于你想用它做什么。矢量矢量可以访问所有数字并逐行保存。这也将保留行内数字的顺序。你可以通过遍历向量找到数字(或者使用STL查找函数做同样的事情)

如果需要插入或删除行/数字,可以考虑使用列表而不是向量。列表具有更好的插入/删除性能,但您失去了随机访问权。

如果您只需要知道是否存在特定数字,那么您可以将它们放入多重集中。你将无法知道一个数字在哪一行,你也失去了行中数字的顺序。

答案 2 :(得分:0)

它可能是最快的(虽然我还没有测试过)简单地将数字一个接一个地放入std::vector,完全忽略行结构,然后单步执行整个过程以检测到在索引i处匹配。然后,您可以获得带有一些索引争用的行( i % 3 ) + {0|1|2}

答案 3 :(得分:0)

如果您可以安全地假设每行总是有3列,那么请使用std::vector<int>。然后,当您想知道数字来自的行/列时,可以使用如下函数:

bool find( const std::vector<int>& numbers, int target, int& row, int& column )
{
    std::vector<int>::iterator it = std::find( numbers.begin(), numbers.end(), target );

    if( it == numbers.end() )
    {
        return false;
    }

    int index = it - numbers.begin();
    row = index / 3;
    column = index % 3;

    return true;
}

// Example:
std::vector<int> numbers = ...
int row, column;

if( find( numbers, 10, row, column ) )
{
    std::cout << "Found at row " << row << ", column " << column << std::endl;
}
else
{
    std::cout << "Not found" << std::endl;
}