std :: find如何自动地知道C++中数组的结尾?

Cha*_*ani -1 c++ arrays stl standard-library

为什么下面的代码中有一个原子变量? - 因为它是更大的代码库的一部分,其中m_subscriptions数组是从多个线程更新的.请跟我一起 ..

这是我的问题:

#include <iostream>
#include <atomic>
#include <algorithm>
#include <iterator>


#define MAX_SUBSCRIPTIONS 45

static std::atomic<int> numberOfSubscriptions;

int main ()
{
    int m_subscriptions[MAX_SUBSCRIPTIONS] = {};
    numberOfSubscriptions.fetch_add(0, std::memory_order_relaxed);

    m_subscriptions[numberOfSubscriptions] = 12;
    numberOfSubscriptions.fetch_add(1);
    m_subscriptions[numberOfSubscriptions] = 13;
    numberOfSubscriptions.fetch_add(1);
    m_subscriptions[numberOfSubscriptions] = 14;
    numberOfSubscriptions.fetch_add(1);
    m_subscriptions[numberOfSubscriptions] = 15;
    numberOfSubscriptions.fetch_add(1);
    m_subscriptions[numberOfSubscriptions] = 16;
    numberOfSubscriptions.fetch_add(1);

    for ( int i = 0; i < numberOfSubscriptions; i++ )
        std::cout << m_subscriptions[ i ] << "\t "; 

    std::cout << std::endl;

    auto result = std::find(m_subscriptions, m_subscriptions + numberOfSubscriptions, 44);

    if ( result == std::end(m_subscriptions) )
        std::cout << "Not Found" << std::endl;
    else 
        std::cout << *result << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

当我传递数组中不存在的内容时,不会打印"Not Found".

如果我更换if ( result == std::end(m_subscriptions) )

if ( result == (m_subscriptions + numberOfSubscriptions) ) 有用 !

怎么样 ??

如何std::find知道m_subscriptions已经初始化了多少个值?它应该继续直到最后,即m_subscriptions [MAX_SUBSCRIPTIONS]就像一个人会期望一台愚蠢的计算机?

换句话说,为什么std::find停止搜索44m_subscriptions + numberOfSubscriptions?为什么不继续m_subscriptions[MAX_SUBSCRIPTIONS]

Jos*_*eld 5

std::find不知道数组或在其中初始化的元素.你用第二个参数告诉它在哪里停下来:

std::find(m_subscriptions, // Start here
          m_subscriptions + numberOfSubscriptions, // Stop here
          44); // Try to find this
Run Code Online (Sandbox Code Playgroud)

如果找不到你想要的东西,它只会返回第二个参数,这是你给它的范围的结束.

如果您已std::end(m_subscriptions)作为第二个参数传递,它将迭代您尚未分配给的所有元素.但是,它注意到这些并非未初始化,它们已被初始化.当您使用聚合初始化时{},您未指定的聚合的任何成员都是初始值.无论如何,即使它们没有被初始化,也没有办法判断是否已经初始化了某些东西.