struct
很长一段时间以来,我一直想用而不是 来迭代 C++ 映射std::pair
。这样做的原因是我总是发现pair.first
和pair.second
有歧义
所以我尝试了这个代码:
map< string, int > wordCounts;
wordCounts[ "a" ] = 37;
wordCounts[ "the" ] = 10;
wordCounts[ "you" ] = 5;
struct WordCountPair {
string word;
int count;
WordCountPair( const pair<const string, int>& p ) :
word( p.first ), count( p.second ) { }
};
for( WordCountPair e : wordCounts ) {
printf( "%s occurred %d times\n", e.word.c_str(), e.count );
}
这种方法有效,但是复制成本有点高
有谁知道有什么方法可以做这样的事情而不发生复制吗?
如果您可以使用 C++17 或更高版本,则可以使用结构化绑定解决问题。这将在后端为返回的对创建一个占位符,然后使用您提供的名称为您提供对的命名引用。这将为您提供类似
确保
const auto&
后端对象是对地图元素的引用,然后word
引用count
该对引用,因此根本不会发生复制。这样就避免了复制。
请注意,它不强制生命周期。但是,在
for(:)
的循环中std::map
,底层存在std::pair
于 中std::map
,因此这些引用相对安全。然而,结构化绑定是解决这个问题的现代惯用方法:
如果您可以使用 C++17 或更高版本,则可以使用结构化绑定来解决问题。这将在后端为返回的对创建一个占位符,然后使用您提供的名称为您提供对的命名引用。这将为您提供类似
这将创建对 的引用,
word
而count
无需创建结构。