容器初始化在 C++98 中
Container initialization in C++98
我必须使用以下规则构造一个有序容器(必须是可迭代的(:
如果条件为 true,则容器
{1,0}
,否则{0,1}
我有以下代码,但我不觉得它"优雅":
vector<int> orderedSides;
if (condition)
{
orderedSides.push_back(1);
orderedSides.push_back(0);
}
else
{
orderedSides.push_back(0);
orderedSides.push_back(1);
}
有没有更好的方法来做到这一点(从简洁和性能的角度来看(?
你可以实现这样的东西:
vector<int> orderedSides(2, 0);
(condition ? orderedSides.front() : orderedSides.back()) = 1;
这比显式 if 子句短一点。
正如下面提到的@Deduplicator,我们可以以更简洁的方式重写第二行:
orderedSides[!condition] = 1;
vector<int> orderedSides;
orderedSides.push_back(condition ? 1 : 0);
orderedSides.push_back(condition ? 0 : 1);
我不认为它更高性能,但我发现它更优雅。
您可以在效率和避免重复之间做出妥协,使用条件初始化第一个,从第一个初始化第二个。
vector<int> orderedSides(1, bool(condition)) ;
orderedSides.push_back(!orderedSides.back());
orderedSides.push_back(0);
orderedSides.push_back(1);
if (condition)
std::iter_swap(orderedSides.begin(), orderedSides.begin()+1);
我知道这需要花费一些成本。作为候选人之一。
如果构建元素(您问题中的int
,无论它在现实生活中是什么(是免费的且无副作用:
static const int data[] = { 0, 1, 0 };
std::vector<int> orderedSides (data+condition, data+condition+2);
完整程序示例:
#include <iostream>
#include <vector>
std::vector<int> make(bool cond)
{
static const int data[] = { 0, 1, 0 };
return std::vector<int> (data+cond, data+cond+2);
}
std::ostream& operator<<(std::ostream& os, const std::vector<int>& v)
{
return os << "{ " << v[0] << ", " << v[1] << " }";
}
int main()
{
std::cout << "true: " << make(true) << "n"
<< "false: " << make(false) << "n";
}
指纹:
true: { 1, 0 }
false: { 0, 1 }
演示
您可以从数组中填充std::vector
,即使在 C++98 中也是如此。
下面是一个示例:
#include <iostream>
#include <vector>
int main() {
bool condition = false;
std::cout << "condition is: " << std::boolalpha << condition << 'n';
int arr[][2] = {{0,1}, {1,0}};
int index = condition;
std::vector<int> v(arr[index], arr[index]+2);
for (int i = 0; i < v.size(); i++)
std::cout << v[i] << ' ';
std::cout << 'n';
}
输出为:
$ g++ tt.cc && ./a.out
condition is: false
0 1
供参考:
- http://en.cppreference.com/w/cpp/container/vector/vector
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 在 C++98 中,'dvd1' 必须由构造函数初始化,而不是由 '{...}' 初始化
- 容器初始化在 C++98 中
- = NULL,在 c++98 中初始化非静态数据成员
- 在 C++98 中初始化结构数组的优雅方法
- C 98如何在标题中初始化静态结构阵列
- 有没有办法检查地图是否已在 C++98 中初始化
- C 98中整数集列表的初始化
- C++98 大括号常量标量初始化
- 值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它
- 我们需要一个可访问的复制构造函数来初始化C++98/03中的值吗
- 在C++(98、11和14)中初始化静态数据成员的正确方法是什么