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
停止搜索44
的m_subscriptions + numberOfSubscriptions
?为什么不继续m_subscriptions[MAX_SUBSCRIPTIONS]
?
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)
作为第二个参数传递,它将迭代您尚未分配给的所有元素.但是,它注意到这些并非未初始化,它们已被初始化.当您使用聚合初始化时{}
,您未指定的聚合的任何成员都是初始值.无论如何,即使它们没有被初始化,也没有办法判断是否已经初始化了某些东西.