向量复制值
Vector duplicates the value
先手下留情,我是C++初学者
我为我的解释器编写了这段代码:从源代码中读取一行并将行拆分为单词。我使用矢量对象来存储单词。这是代码,源是文件描述符(ifstream):
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
typedef unsigned int UIntegerP;
#define V(X, Y, Z) X##Y##Z
#define Version V(0, 0, 1)
#define Free 0x0
int main(int ACount, char *Arguments[]){
if(ACount < 2){
cout << "Venus Interpreter - Engine V: " << Version << " - Interprate: -I <Source> \n";
}else{
if(Arguments[1][0] == '-' && Arguments[1][1] == 'I'){
if(ACount < 3){
cout << "Error: No input files \n";
}else if(ACount > 3){
cout << "Error: Too much arguments \n";
}else{
ifstream Source(Arguments[2]);
if(Source.good()){
# define __TEST__ 1
string Line;
vector<string> Words;
string Word;
while(getline(Source, Line)){
for(unsigned long Index = 0; Index <= Line.length(); Index++){
if(Line[Index] == ' ' or Line[Index] == '[=10=]'){
Words.push_back(Word); //Inject the Word to Words
Word.clear();
} else {
Word += Line[Index];
}
}
# if __TEST__
cout << Words[0] << "\n";
# endif
//Interpration starts here
Words.clear();
}
}else{
cout << "Error: File does not exist \n";
}
Source.close();
}
}else{
cout << "Error: Unknown operand \n";
}
}
return 0;
}
这是程序解释的文件:
10 * 20 / 5 * 10
Asparagas
这是输出:
10
10
正如您在此处看到的,值是重复的。有什么问题?
你的问题是,对于第 10 * 20 / 5 * 10
行,你将单词插入向量,然后打印出它的第一个元素
#if __TEST__
cout << Words[0] << "\n";
#endif
然后你(我假设)认为你正在清除带有以下行的向量
Words.empty();
但是,这并没有清除向量,它returns一个布尔值显示向量是否为空 (documentation on vector.empty())
要清除向量,您应该使用 vector.clear()
第二次循环,当你处理 asparagus
时,你打印向量中的第一个元素,即 10
,因为它仍然在第一个 getline
先手下留情,我是C++初学者
我为我的解释器编写了这段代码:从源代码中读取一行并将行拆分为单词。我使用矢量对象来存储单词。这是代码,源是文件描述符(ifstream):
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
typedef unsigned int UIntegerP;
#define V(X, Y, Z) X##Y##Z
#define Version V(0, 0, 1)
#define Free 0x0
int main(int ACount, char *Arguments[]){
if(ACount < 2){
cout << "Venus Interpreter - Engine V: " << Version << " - Interprate: -I <Source> \n";
}else{
if(Arguments[1][0] == '-' && Arguments[1][1] == 'I'){
if(ACount < 3){
cout << "Error: No input files \n";
}else if(ACount > 3){
cout << "Error: Too much arguments \n";
}else{
ifstream Source(Arguments[2]);
if(Source.good()){
# define __TEST__ 1
string Line;
vector<string> Words;
string Word;
while(getline(Source, Line)){
for(unsigned long Index = 0; Index <= Line.length(); Index++){
if(Line[Index] == ' ' or Line[Index] == '[=10=]'){
Words.push_back(Word); //Inject the Word to Words
Word.clear();
} else {
Word += Line[Index];
}
}
# if __TEST__
cout << Words[0] << "\n";
# endif
//Interpration starts here
Words.clear();
}
}else{
cout << "Error: File does not exist \n";
}
Source.close();
}
}else{
cout << "Error: Unknown operand \n";
}
}
return 0;
}
这是程序解释的文件:
10 * 20 / 5 * 10
Asparagas
这是输出:
10
10
正如您在此处看到的,值是重复的。有什么问题?
你的问题是,对于第 10 * 20 / 5 * 10
行,你将单词插入向量,然后打印出它的第一个元素
#if __TEST__
cout << Words[0] << "\n";
#endif
然后你(我假设)认为你正在清除带有以下行的向量
Words.empty();
但是,这并没有清除向量,它returns一个布尔值显示向量是否为空 (documentation on vector.empty())
要清除向量,您应该使用 vector.clear()
第二次循环,当你处理 asparagus
时,你打印向量中的第一个元素,即 10
,因为它仍然在第一个 getline