我想编写一个函数,它将一个指向一个字符串(Dictionary)的向量指针和一个指向char(p)的指针作为输入。该函数将检查字符是否在字典中,如果它不在那里,它会在向量字典中添加p。
我的代码:
#include <iostream>
#include <string>
#include <vector>
using std::string;
using std::vector;
std::vector<string *> dictionary;
void manageDictionary(vector<string *> * dictionary, char *p) {
for (unsigned int i = 0; i < (*dictionary).size(); i++) {
string * pstring = (*dictionary).at(i);
if ((*pstring).compare(p)) {
(*dictionary).push_back(p);
}
}
}
然而,visual studio编译器显示我在push_back方法(.
)之前的if语句中有错误。当我将鼠标悬停在错误上时,它会显示&#34;没有重载功能的实例&#34;。
我在开头添加了std::vector<string *> dictionary;
,仍然无法找出问题所在。
答案 0 :(得分:1)
dictionnary
是std::string*
的向量。 std::string*
和char*
完全不相关。要从char*
转换为std::string*
,您需要为自己的词典创建一个包含string
值的新p
,而不是直接传递char*
。此更改将允许您的示例进行编译,但生成的函数容易出错。
#include <string>
#include <vector>
using std::string;
using std::vector;
void manageDictionnary(vector<string *> * dictionnary, char *p) {
for (unsigned int i = 0; i < (*dictionnary).size(); i++) {
string * pstring = (*dictionnary).at(i);
if ((*pstring).compare(p)) {
(*dictionnary).push_back(new string(p));
// Make a new string ^^^^^^^^^^
}
}
}
此解决方案将要求您手动删除字符串,这与c ++中的操作方式不同。从std::vector<std::string*>
更改为简单std::vector<std::string>
将解决此问题,并避免将来出现问题。还有其他不必要的指针可以删除。由于at(i)
会返回string&
,因此我们应将pstring
更改为string&
。由于dictionnary
不是可选的(不能nullptr
)且始终指向相同的vector
,我们也可以将其更改为vector<string>&
。
void manageDictionnary(vector<string> & dictionnary, char *p) {
for (unsigned int i = 0; i < dictionnary.size(); i++) {
string & pstring = dictionnary.at(i);
if (pstring.compare(p)) {
dictionnary.push_back(p);
}
}
}
这个最新版本将运行良好,更符合c ++的资源管理理念。我建议您阅读以下几个主题:
此外,请考虑使用std::set<string>
或std::unordered_set<string>
来更方便地表示字典。
将来请注意,访问指针方法的首选方法是ptr->foo()
,而不是(*ptr).foo()
。