解析整数列表以进行向量、映射或多映射

parsing lists of integers to vector or map or multimap?

本文关键字:映射 向量 整数 列表      更新时间:2023-10-16

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

2323 0 1212
2424 0 1313
2525 1 1414

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

我能用什么?我应该使用多个向量吗?还是可以将它们存储在多映射或boost::元组中?

我不能使用c++11,我只有有限的增强支持(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 lambdas的情况下使用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查找函数来查找相同的数字)

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

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

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

如果可以安全地假设每行总是有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;
}