C ++ Equiv。 C#的intQueue.Contains()

时间:2016-07-23 03:07:28

标签: c# c++ queue translate fifo

我正在将一些代码从C#翻译成C ++,而我却陷入了一个看似基本的问题。

我想做一个简单的评估,看看int的FIFO队列是否包含特定的int。这可不难,但我似乎无法在Google上找到一个好的例子。

if(intQueue.Contains(value)){ /* do some stuff */ }

我在here上发现了同样的问题,但答案并不适用于我的情况。请帮忙!谢谢!

4 个答案:

答案 0 :(得分:2)

我可能会使用std::find()中的<algorithm>。您需要将开头和结束迭代器传递给它,而使用queue类无法访问它,因此一个很好的选择是deque

deque的功能类似于队列,因为项目可以被推送和弹出,但项目不限于&#34;先进先出&#34;模型。可以从后面和前面弹出和推动项目。这是queue类默认在内部存储其元素的方式。

#include <deque>
#include <algorithm>
#include <iostream>

int main()
{
    // initialize deque with ints 3, 2, 1
    std::deque<int> intDeque{ 3, 2, 1 };

    auto it = std::find(intDeque.begin(), intDeque.end(), 2); // find 2 in intDeque

    if (it == intDeque.end()) {
        std::cout << "Not found" << std::endl;
    }
    else {
        std::cout << "Found!" << std::endl;
    }

    return 0;
}

以上使用c ++ 11,如果你无法访问它,你可以这样做:

std::deque<int> intDeque;
// push elements onto the deque
intDeque.push_back(3);
intDeque.push_back(2);
intDeque.push_back(1);

std::deque<int>::iterator it = std::find(intDeque.begin(), intDeque.end(), 2); // find 2 in intDeque

答案 1 :(得分:0)

&#39; PC Luddite&#39;有答案,但这里是你的例子的直接转换:

#include <deque>
#include <algorithm>

...

std::deque<int> intQueue;
if (std::find(intQueue.begin(), intQueue.end(), value) != intQueue.end())
{
}

答案 2 :(得分:0)

因此,如果直接使用dequelist是不可接受的,queue不适合有效搜索。让我们用cbegin / cend扩展队列并启用std::find

template <typename _Ty, typename _Container = deque<_Ty>>
class searchable_queue : public std::queue<_Ty, _Container>
{
public:
    template<class... _Axx>
    searchable_queue(_Axx&&... _Ax) 
        : std::queue<_Ty, _Container>(std::forward<_Axx>(_Ax)...)
    {}

    typename _Container::const_iterator cbegin() const noexcept
    { 
         return (c.cbegin());
    }

    typename _Container::const_iterator cend() const noexcept
    {   
        return (c.cend());
    }
};

int main() 
{
    list<int> l = { 11, 22, 44, 55 };
    auto q = searchable_queue<int,list<int>>(std::move(l));
    auto res = std::find(q.cbegin(), q.cend(), 22);
    cout << boolalpha << (res != q.cend()) << '\n'; //displays 'true'
    res = std::find(q.cbegin(), q.cend(), 77);
    cout << boolalpha << (res != q.cend()) << '\n'; // displays 'false'
    return 0;
}

答案 3 :(得分:0)

如果您可以使用C ++ 11及更高版本,我建议使用any_of算法:

#include <algorithm>

if(std::any_of(intQueue.begin(), intQueue.end(), value))
{
  //do some stuff here
}

无论使用哪种数据结构都无关紧要,只要它提供迭代器即可。

注意!您唯一需要注意的是所需的复杂性。在这里,您可能最终得到 O(N)比较。 ,如果基础队列已知为已排序(例如优先级队列),则可以改善运行时要 O(log N)。唯一的问题是(例如std::priority_queue)不提供迭代器,你需要另一个std::priority_queue实例在弹出头部后放置元素或者你就地对数据结构进行排序使用std::binary_search检查所需的元素是否存在:

#include <deque>
#include <algorithm>

// std::deque<int> intQueue;
std::sort(intQueue.begin(), intQueue.end()); // !!! this is O(N log N) !!!


if(std::binary_search(intQueue.begin(), intQueue.end(), value)) // O(log N)
{
  //do some stuff here
}

事实证明:你需要在初始排序后保持排序条件( O(log N)插入时间),否则你最终会变得更糟运行复杂性。特别是,您可能需要将元素作为FIFO顺序中的状态,而不是第二种方法不适用。