容器初始化在 C++98 中

Container initialization in C++98

本文关键字:C++98 初始化      更新时间:2023-10-16

我必须使用以下规则构造一个有序容器(必须是可迭代的(:

如果条件为 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