我想使用单个函数与多个私有(private)成员变量进行交互。我想出了:
class Some_Vectors {
public:
int is_value_in_vector(string vector_name, int value);
void append_value_to_vector(string vector_name, int value)
private:
vector<int> A;
vector<int> B;
};
// returns value's index if it's there, -1 if not
int Some_Vectors::is_value_in_vector(string vector_name, int value) {
vector<int> *selected_vector;
if (vector_name == "A") {selected_vector = &A;}
else if (vector_name == "B") {selected_vector = &B;}
for (int i = 0; i < selected_vector->size(); i++){
if (selected_vector[0][i] == value){
return i;
}
}
return -1;
}
它有效,但我觉得比较这样的字符串不安全/脆弱。有没有办法在函数调用中专门引用一个私有(private)变量?
编辑为(希望)不那么主观的问题。我最终采用了 RichardCritten 关于调用单个私有(private)函数的多个公共(public)函数的建议。
您可以使用 unordered_map
来实现您的需求,如下所示。
如下声明 unordered_map
。
unordered_map<string, vector<int>> umap;
使用 [] 运算符插入要映射的值。
umap["A"] = {10,20};
umap["B"] = {30,40};
使用 find 函数在 unordered_map
中搜索键值,如下所示。
string vector_name = "A";
vector_name = "A";
auto it = umap.find(vector_name);
if (it == umap.end())
return -1;
在 map 中找到 key,value
对后,在 vector
中搜索特定的 int
,如下所示。
std::vector<int>::iterator iter = std::find(it->second.begin(), it->second.end(), 20);
如果 iter
没有指向 vector
端,则返回 int
在 vector< 中的确切位置
如下。
if ( iter != it->second.end())
return std::distance(it->second.begin(),iter);
else
return -1;
您的完整示例代码可能如下所示。
int main()
{
unordered_map<string, vector<int>> umap;
// inserting values by using [] operator
umap["A"] = {10,20};
umap["B"] = {30,40};
string vector_name = "A";
vector_name = "A";
auto it = umap.find(vector_name);
if (it == umap.end())
return -1;
std::vector<int>::iterator iter = std::find(it->second.begin(), it->second.end(), 20);
if ( iter != it->second.end())
return std::distance(it->second.begin(),iter);
else
return -1;
}