C++ 存储文件中的文本

C++ 存储文件中的文本,c++,C++,我的文件包含以下代码: test.asm ^^^^^^^^^^^^^^^^ !START: !LDA #97 !LDX #$A000 !STA, X !END 我将上述代码以名为sourcecode的字符串形式存储在程序中。 每一个标签(对我来说是一个关键字)都以开头标记。 因此,START/LDA/LDX/STA/END是我想要存储的标签。 现在文件的内容可能会有所不同 我想知道我可以使用哪个STL容器来存储我的关键字。 请注意,每个关键字都存储在该容器的单个元素中 如果vector可以解决

我的文件包含以下代码:

test.asm

^^^^^^^^^^^^^^^^

!START:
!LDA #97
!LDX #$A000
!STA, X
!END
我将上述代码以名为
sourcecode
的字符串形式存储在程序中。 每一个标签(对我来说是一个关键字)都以
开头标记。
因此,
START/LDA/LDX/STA/END
是我想要存储的标签。 现在文件的内容可能会有所不同

我想知道我可以使用哪个STL容器来存储我的
关键字
。 请注意,每个关键字都存储在该容器的单个元素中

如果
vector
可以解决我的问题,可以举个例子吗? 我的主要目标是使用这些标签/关键字传递要解释的函数 作为助记符(我将对其进行定义)

另外,想知道如果我的向量类型为string:
vector


提前感谢。

6502组装-多有趣啊

正如tenfour所说,vector有利于紧凑且相对不可变的存储和访问,但您在应用生命周期内的使用情况应该指导您的选择。(好消息是,如果您使用STL迭代器,您应该能够切换容器类型,而对代码的其余部分影响很小。)

这里有几页可以帮助您决定:


玩得开心

要决定一个完美的容器,请遵循以下策略

1.)首先,由于您意识到您的最终目标是对包含一些字符串(您称之为关键字)的文件进行排序,因此您肯定应该使用像vector或deque这样的连续内存容器,因为在链接容器(列表、映射)上运行排序将非常缓慢。但是,由于您从文件中获取数据,因此无法提前初始化向量的大小!!!这可能会导致您在向量中不断填充新元素(使用push_back()),并且向量在内部必须随着容器的每次重新定位而复制其元素。虽然,您可以通过确保向量的容量来反映输入的预期大小来避免这个问题,但是我们假设您对输入大小没有任何概念

2.)现在,考虑到这种情况,一个简单但有效的策略是首先读取文件,并将所有关键字存储在链表这样的链接结构中

- list<string> myList ;

您可能希望通过以下方式读取文件:

std::ifstream infile("yourfile.asm");

std::vector<std::string> lines;

std::copy(std::istream_iterator<line>(infile), 
          std::istream_iterator<line>(),
          std::back_inserter(lines));
std::ifstream-infle(“yourfile.asm”);
std::矢量线;
std::copy(std::istream_迭代器(infle),
std::istream_迭代器(),
标准:背面插入器(线);
如果你想过滤掉所有不是以“!”开头的东西同时,这也相当容易:

struct not_label { 
    bool operator()(std::string const &line) { 
       return line[0] != '!';
    }
};

std::remove_copy_if(std::istream_iterator<line>(infile), 
                    std::istream_iterator<line>(),
                    std::back_inserter(lines),
                    not_label());
struct not_label{
bool运算符()(std::string const&line){
返回行[0]!='!';
}
};
std::remove\u copy\u if(std::istream\u迭代器(infle),
std::istream_迭代器(),
标准:背面插入器(线),
而不是标签();
这两种方法都使用了我在前面的答案中发布的方法


编辑:与(显然)流行的观点相反,尝试最小化std::vector的重新分配很少有价值。实际上,
std::vector
使用的分配策略确保(平均而言)向量中的项目被复制的最大次数是固定的,而且这个数字低到足以让大多数人吃惊(对于一个典型的实现,大约3次)。尤其是当你同时进行I/O时,优化向量重新分配通常是毫无意义的——如果你真的想优化某个东西,I/O几乎总是值得关注的部分。

如果你只想存储一系列东西,
std::vector
。但这不是一个很好的答案,因为您还没有指定要对数据执行的其他操作。这将是获得更好答案的关键。您可以一直读取文件,直到遇到EOF以获得行计数,用足够的空间初始化向量,然后再次读取文件以实际复制关键字。这是否更有效超出了我的知识范围。将数据加载到列表中以避免重新分配向量充其量是一种过早的优化(通常会以悲观告终)。
std::ifstream infile("yourfile.asm");

std::vector<std::string> lines;

std::copy(std::istream_iterator<line>(infile), 
          std::istream_iterator<line>(),
          std::back_inserter(lines));
struct not_label { 
    bool operator()(std::string const &line) { 
       return line[0] != '!';
    }
};

std::remove_copy_if(std::istream_iterator<line>(infile), 
                    std::istream_iterator<line>(),
                    std::back_inserter(lines),
                    not_label());