c++ - 如果找不到键,则返回一个空的字符串 vector

标签 c++ stl vector return-value stdvector

我知道这是一个非常糟糕的主意,因此关于如何有效地执行此操作的其他建议将会受到欢迎。

事情是这样的。我有map<string,vector<string> > ,我想搜索一个键并返回其对应的值(在本例中为字符串 vector )。我坚持返回(而不仅仅是迭代)的原因是我需要搜索其他 vector 中返回的值。

一个例子可以清楚地说明这一点:

Input:

key1 ---> {2,3,4}
key2 ---> {1}
key3 ---> {2,12,11,9}

对于 key1 作为输入,应返回值为 2、3、4 的 vector 。现在需要在其他字符串 vector 中搜索这 2,3,4 个值。最有效的方法是什么?

我试过这样的:

vector<string> returnEdges(string key)
{
    for (map<string, vector<string> >::iterator it=outgoing.begin();
    it!=outgoing.end();++it)
    {
        if (key.compare((*it).first)==0)
        {
            return (*it).second;
        }
    }


    //return string<;//what should I return here????


}

1) 如果找不到 key ,我应该如何返回空 vector ?

2) 什么是最好的实现方式?

我希望问题很清楚。

编辑:当我写这个问题时,我想为什么不返回一个迭代器? SO 的人赞同这个想法吗?

最佳答案

1) 返回一个迭代器是个好主意。执行此操作时,指示“未找到”情况的自然方法是返回 .end() 迭代器。这有一个抽象有点泄漏的缺点:调用者必须能够得到这个 .end() 值以便与它进行比较以进行错误检查,并且返回的迭代器公开了一个比你更丰富的接口(interface)就像(客户端代码不应该真的玩弄递增和递减迭代器)。

2) 返回一个空 vector 就像创建一个空 vector 并返回它一样简单。创建一个空 vector = 构造一个空 vector 。这就是您从 - 鼓声 - vector 类的默认构造函数中得到的。

3) 您不需要也不应该自己实现搜索循环。标准库已经为您实现了这一点。 (由于键/值的区别,find 有一个专门的 map 函数。对于像 listvectordeque 这样的序列,更喜欢自由函数 std::find,它来自 <algorithm>

4) 你应该更喜欢接受函数参数(当它们是类的实例时,比如 std::string )并通过 const 引用返回数据(尤其是复杂的东西,比如字符串 vector )。按值传递和返回意味着一个拷贝;有时编译器可以优化它,但它并不像我们想要的那样可靠。此外,您首先使用 C++ 的原因是为了对事物进行那种级别的控制,对吗?如果没有,那就不要用它来折磨自己。

但是,如果您有时要返回一个新创建的值,则不能这样做。另一种设计接口(interface)的方法是返回映射中字符串 vector 的指针(请注意,对这些字符串的指针算法将无效),如果未找到该值,则返回 NULL 指针。这避免了复制并将“未找到”结果与数据中的实际空 vector 区分开来,但这意味着客户端代码必须处理一个令人讨厌的原始指针。

5) 在函数名称中包含“return”是没有用的,因为返回是函数的作用。 OTOH,以一种能清楚说明参数为何如此的方式命名事物是个好主意。

6) 对于复杂类型的迭代器,设置 typedef 通常是个好主意。

返回迭代器非常简单:

typedef map<string, vector<string> >::iterator graph_iterator;
graph_iterator edges_named(const string& node_name) {
    return outgoing.find(node_name);
}

返回字符串 vector 非常简单:

typedef map<string, vector<string> >::iterator graph_iterator;
vector<string> edges_named(const string& node_name) {
    graph_iterator it = outgoing.find(node_name);
    return it == outgoing.end() ? vector<string>() : it->second;
}

返回一个指针很简单:

typedef map<string, vector<string> >::iterator graph_iterator;
vector<string>* edges_named(const string& node_name) {
    graph_iterator it = outgoing.find(node_name);
    return it == outgoing.end() ? NULL : &(it->second);
}

明智地选择。

关于c++ - 如果找不到键,则返回一个空的字符串 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439167/

相关文章:

c++ - 从其他容器构造的 STL 容器(例如,从 vector 列表)

c++ - 如何从原始数据加载 devIL 图像

c++ - 包含自定义头文件的编译器错误

c++ - 使用 ShellExecute() 与手动打开命令提示符有什么区别?

铁路围栏密码的C++程序

c++ - 将 Vector 从一个类传递到另一个类以进行操作

c++ - 在 vector 中查找不相等的相邻索引

c++ - 我应该如何从 parent 的插槽中删除子对象?可能是 boost::asio 特定的

带有 jemalloc 的 C++ STL

c++ - 如何在包含char和pair<int,string>的map中按键删除元素