我可能犯了一个非常明显的错误,但我无法看到它,我希望有人可以帮助我。
我想在我的C ++程序中将2个字符串添加到对向量中。容器看起来像vector< pair < word , type > > vec
。这个词可以是任何东西,类型是名词,形容词,动词等。例如< Hogwarts , noun>
,< Hungry, adjective>
等。
我在这里将单词添加到单词bank中。 FileStrings只是从File I / O创建的另一个容器。这里一切都很好。
for(unsigned int i = 0; i < fileStrings.size(); ++i)
{
cout << "Adding " << fileStrings[i] << ", " << fileStrings[i + 1] << endl;
theWordBank.addWord(fileStrings[i], fileStrings[++i]);
}
在这里,我迷路了。打印出newWord时,它与newType完全相同。我无法理解它,我也不理解newWord如何从上面的代码片段中失去其价值。
void addWord(const string& newWord, const string& newType)
{
mWords.push_back(make_pair(newWord, newType));
std::cout << "newWord " << newWord << ", " << newType << std::endl;
}
再次,结果应该是< Hogwarts, noun>
,但我得到< noun, noun>
对mWords向量中的所有内容。我认为它甚至没有任何关于mWords的东西。我的addWord函数的赋值列表是否出错?
答案 0 :(得分:5)
这可能是你的问题:
theWordBank.addWord(fileStrings[i], fileStrings[++i]);
未定义的行为在表达式中多次使用i
,其中您还使用++i
(或其他递增/递减运算符)。这样做:
for(unsigned int i = 0; i < fileStrings.size(); i += 2)
theWordBank.addWord(fileStrings[i], fileStrings[i + 1]);
}
在表现上绝对没有明显差异。
答案 1 :(得分:1)
您的代码还有其他问题。您正在访问cout
中的向量范围之外的元素。
for(unsigned int i = 0; i < fileStrings.size(); ++i)
{
cout << "Adding " << fileStrings[i] << ", " << fileStrings[i + 1] << endl;
假设fileStrings包含1个项目。 fileStrings[i+1]
将尝试访问fileStrings[1]
,这是一种越界访问。
答案 2 :(得分:0)
在C ++中,未定义评估函数参数的顺序。完全有可能在您的实现中,theWordBank.addWord(fileStrings[i], fileStrings[++i]);
中的第二个参数在第一个参数之前进行评估。
请注意,你不应该依赖于此;当您调用未定义的行为时,您的编译器可以随心所欲地执行任何操作。它可能表现不一致。它似乎现在可以工作,然后用不同的编译器版本神秘地失败。将其更改为不依赖于参数评估顺序的内容,例如
theWordBank.addWord(fileStrings[i], fileStrings[i+1]);
++i;