相关疑难解决方法(0)

C++标准的核心语言规范中的注释和示例是非规范性的吗?

通常在SO(以及其他地方),我已经看到C++标准中的注释和示例不是规范性的说法 - 我可能已经多次提出这个主张.

但是,我在C++标准的核心语言规范中找不到这个事实的证据(目前我在查看n3979 C++ 14工作草案).

我能找到的最接近的报价见第17.5.1.2/2段:

标有"注释:"或"示例:"的段落是提供信息的,其他段落是规范性的.

但是,除非我错误地认为该段只适用于图书馆部分(即第18至30条和附件D).

因此,问题是:C++标准中的所有注释和示例都是非规范性的吗?脚注怎么样?

c++ iso language-lawyer c++11 c++14

21
推荐指数
2
解决办法
606
查看次数

使用 Ranges-V3 移除标记为移除的元素

我有两个向量:

struct MyData{
     double value; 
};
std::vector<int> remove_flags = {0, 1, 0, 0, 0, 0, 1, 0};
std::vector<MyData> data =      {{},{},{},{},{},{},{},{}}; 
Run Code Online (Sandbox Code Playgroud)

remove_flags向量包含一个大小与 完全相同的标志数组data,每个标志要么是 0,要么是 1,其中 1 表示应删除数据。

我想用来remove_flagsdata原地删除元素,即执行擦除删除习语,但根据remove_flags. 最终结果应该是data删除了元素,并希望删除remove_flags了那些相同的元素。

手动执行此操作很烦人,我想为此使用 Range-v3。我目前正在使用 C++17。

在查看文档后,我认为我没有找到解决方案,我能想到的最接近的事情是:

auto result = ranges::views::zip(remove_flags, data) | ranges::actions::remove_if([](std::pair<const int&, const MyData&> pair){
    return pair.first != 0;
});

remove_flags.erase(result.first, remove_flags.end());
data.erase(result.second, data.end());
Run Code Online (Sandbox Code Playgroud)

但是操作无法对视图 zip 进行操作,因此无法编译。如果我切换ranges::actions::remove_ifranges::views::remove_if一个奇怪的视图对象被返回,大概是一个没有实际std::remove对两个向量执行等效操作的对象。

可以使用,contaner_to …

c++ erase-remove-idiom range-v3 c++17

7
推荐指数
1
解决办法
195
查看次数

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

c++17 ×1

erase-remove-idiom ×1

iso ×1

language-lawyer ×1

range-v3 ×1