存储文件中的文本

时间:2011-03-22 19:03:50

标签: c++

我的文件包含以下代码:

test.asm

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

!START:
!LDA #97
!LDX #$A000
!STA, X
!END

我将上面的代码存储在我的程序中,名为sourcecode。 每个标签(此处为我的关键字类型)都以!标记开头。 因此,START / LDA / LDX / STA / END是我想要存储的标签。 现在文件的内容可能会有所不同。

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

如果vector可以解决我的问题,可以举例说明吗? 我的主要目的是使用这些标签/关键字传递要解释的功能 作为助记符(我将定义)。

另外,想知道如果我的矢量是字符串类型,我将如何迭代:vector<string>

提前致谢。

3 个答案:

答案 0 :(得分:1)

6502汇编 - 真有趣!

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

这里有几页可供帮助决定:

http://www.cplusplus.com/reference/stl/

http://en.wikipedia.org/wiki/Standard_Template_Library

玩得开心!

答案 1 :(得分:1)

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

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

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

- list<string> myList ;

然后,在结尾处逐个插入此列表中的元素。现在好处是没有任何数量的插入会导致重新分配,就像矢量一样。

现在,一旦你完成了所有元素的阅读,就会声明一个字符串向量,并在其构造函数中提供迭代器范围=&gt; myList.begin()和myList.end()。

- vector<string> myVect(myList.begin(), myList.end()) ; // assigns all elements in myList to myVect.

这将有效地使列表中具有相同元素的向量,但现在所有元素都是连续的,并且应用sort()算法将像魅力一样工作!


此策略中还可以进行进一步的优化。因为,一旦将列表中的所有元素复制到向量,就可以放开列表并释放其内存。要实现此目的,请在将myList复制到myVect之后使用此代码段。

myList.clear(); // erases all elements from list

答案 2 :(得分:0)

您可能希望使用以下内容读取文件:

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());

这两个都使用我在上一个答案中发布的line proxy

编辑:与(显然)流行的看法相反,试图尽量减少std::vector的重新分配很少值得。实际上,std::vector使用的分配策略确保(平均而言)向量中的项目被复制的固定最大次数 - 并且该数字足够低以使大多数人感到惊讶(大约3个一个典型的实现)。特别是当你在同一时间进行I / O时,优化向量重新分配通常是毫无意义的 - 如果你真的想要优化某些东西,那么I / O几乎总是值得集中的部分。