C++:使用来自其他静态初始化容器的数据静态初始化容器

C++:使用来自其他静态初始化容器的数据静态初始化容器,c++,std,c++20,C++,Std,C++20,有没有办法将一个静态初始化容器的键/值映射到另一个静态初始化容器?诸如此类: #include <iostream> #include <set> using namespace std; const set< pair< string, int > > my_set = { ( "three" , 3 ), ( "seven" , 7 ), ( "twelve&quo

有没有办法将一个静态初始化容器的键/值映射到另一个静态初始化容器?诸如此类:

#include <iostream>
#include <set>
using namespace std;

const set< pair< string, int > > my_set = {
    ( "three" , 3  ),
    ( "seven" , 7  ),
    ( "twelve", 12 )
};

//how to statically extract pairs' first values?
const set< string > my_strings = my_set.values().map( []( const auto & pair ){ return pair.first; } );

int main() {
    cout << "statically initialized set:" << endl;
    for ( const auto & v : my_strings )
        cout << "    " << v << endl;
}
对于range-v3:

常量集<字符串>我的字符串= 我的电视机 |范围::视图::键 |范围::至;
视图::键在C++20中,但范围::到不在。

不需要特殊的库或C++20


请注意,std::set没有constexpr构造函数,它不会进行编译时初始化。

为了完整性,您能指出标准中保证在my_字符串之前构造my_集的部分吗?@Jeffrey@Barry这只对同一TU中的内容有效,对吗?否则SIOF?@nosenseal是的,但问题是关于同一个TU。您必须非常小心的是静态数据是否在不同的翻译单元中。当前答案假设数据与您的问题在同一个文件中排序,如果删除该假设,您将得到不同的答案。谢谢您的回答!在这种情况下,我的_字符串是静态初始化的吗?什么场景…=[]{}; 构造方法?我在哪里可以读到它?提前谢谢。@Slaus我不确定您所说的静态是什么意思,是的,它将正确初始化,您无法修改它,但由于std::set没有constexpr构造函数,它不会在编译时初始化,即我的_集和我的_字符串都是在运行时构造的谢谢回答。是的,我想知道初始化是否会在编译时发生。所以我猜它是在main开始执行之前初始化的…@Slaus和[]{};是一个即时调用的lambda函数,我没有注意到我没有发送这个消息:P@appleapple这个习语更常见的名称是IIFE:immediatecalledfunctionexpression
statically initialized set:
    three
    seven
    twelve
#include <iostream>
#include <set>
using namespace std;

const set< pair< string, int > > my_set = {
    { "three" , 3  },
    { "seven" , 7  },
    { "twelve", 12 }
};

//how to statically extract pairs' first values?
const set< string > my_strings = []{
    set<string> data;
    for(auto& pair: my_set){ // or with c++20 : ranges & use set's InputIt constructor
        data.insert(pair.first);
    }
    return data;
}();

int main() {
    cout << "statically initialized set:" << endl;
    for ( const auto & v : my_strings )
        cout << "    " << v << endl;
}