将整数列表解析为矢量或映射或多映射?

parsing lists of integers to vector or map or multimap?

我有一个格式如下的列表:

2323 0 1212
2424 0 1313
2525 1 1414

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

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

我不能使用 c++11,我只有有限的 boost 支持(安装了 1.36,但我无法更新)。

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

提前致谢

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

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

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

编辑:按照 Thomas Matthews 的建议,为了让事情变得更容易,您可以重载运算符>>,以便您的结构直接从文件中读取:

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;
}

这取决于你想用它做什么。向量的向量可以访问所有数字并逐行保存它们。这也将保留行内数字的顺序。您可以通过遍历向量来查找数字(或使用执行相同操作的 STL 查找函数)

如果您需要插入或删除rows/numbers,您可以考虑使用列表而不是向量。列表对于 insert/delete 有更好的性能,但你失去了随机访问。

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

可能是最快的(虽然我没有测试过)简单地将数字一个接一个地扔进一个 std::vector,完全忽略行结构,然后逐步完成整个事情检测索引 i 处的匹配项。然后,您可以获得带有一些索引争用的行,如 ( i % 3 ) + {0|1|2}.

如果您可以安全地假设每一行总是有 3 列,则使用 std::vector<int>。然后当你想知道一个数字来自row/column时,你可以使用这样的函数:

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;
}