标签: iterator

强制foreach使用const迭代器

我有一个实现cbegin()cend()功能的自定义容器类.然后我在foreach循环中使用它,但它似乎需要begin()end()成员函数,即使我尝试使用const修饰符:

for (const auto val: container)
Run Code Online (Sandbox Code Playgroud)

和这样:

for (auto const val: container)
Run Code Online (Sandbox Code Playgroud)

和这样:

for (const auto const val: container)
Run Code Online (Sandbox Code Playgroud)

是否有可能强迫foreach使用常数c函数?

c++ containers iterator c++11

7
推荐指数
2
解决办法
1548
查看次数

具有代理迭代器/引用和auto的容器

我执行与代理迭代器/引用类型的容器类似,以std::vector<bool>和冲突到了以下问题,我着手进行例举std::vector<bool>(这个问题不是std::vector<bool>!):

#include <vector>
#include <type_traits>
int main() {
  using namespace std;
  vector<bool> vec = {true, false, true, false};
  auto value = vec[2];  // expect: "vector<bool>::value_type"
  const auto& reference = vec[2]; // expect: "vector<bool>::const_reference"

  static_assert(is_same<decltype(value), vector<bool>::value_type>::value, 
                "fails: type is vector<bool>::reference!");
  static_assert(is_same<decltype(reference), 
                        vector<bool>::const_reference>::value,
                "fails: type is const vector<bool>::reference&!"); 

  /// Consequence:
  auto other_value = value; 
  other_value = false; 
  assert(vec[2] == true && "fails: assignment modified the vector");
Run Code Online (Sandbox Code Playgroud)
  • 有没有办法实现代理类型,以便静态断言传递?

  • 在实现这样的容器时,是否有关于如何处理此问题的指导原则?

也许通过使用转换运算符来auto/ auto&/ auto&& …

c++ iterator generic-programming c++11 c++14

7
推荐指数
2
解决办法
2173
查看次数

未经检查的转化

我不想压制警告.还有另一种处理此警告的方法吗?

"Iterator类型的表达式需要未经检查的转换以符合Iterator"

Iterator<String> it = schemaJSON.getJSONObject("body").keys();
Run Code Online (Sandbox Code Playgroud)

java android json iterator

7
推荐指数
2
解决办法
8461
查看次数

通过Java中的ArrayLists的ArrayList进行迭代

我有以下ArrayList ...

ArrayList<ArrayList<Integer>> row1 = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)

添加了以下arraylists ....

row1.add(cell1);
row1.add(cell2);
row1.add(cell3);
row1.add(cell4);
row1.add(totalStockCell);
Run Code Online (Sandbox Code Playgroud)

我想遍历arraylist row1并打印内容.

循环中的循环会在这里工作吗?

例如

while(it.hasNext()) {

//loop on entire list of arraylists
    while(it2.hasNext) {
      //each cell print values in list

          } }
Run Code Online (Sandbox Code Playgroud)

java iterator arraylist

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

如何为一长串整数创建一个优化的迭代器?

假设我有一个非常大的整数列表,占用了大量的内存.如果列表的整数是偶数增量,那么我可以很容易地将列表表示为占用相对没有内存的迭代器.但是对于更复杂的模式,将此列表表示为迭代器将变得更加困难.

是否有一个Python包可以分析整数列表并返回"优化"迭代器?或者我可以研究的方法来实现这个目标?

python integer iterator list listiterator

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

operator->返回指针的有效性

我正在实现一个二维数组容器(比如boost::multi_array<T,2>,主要用于练习).为了使用双索引表示法(a[i][j]),我引入了一个代理类row_view(const_row_view但我不关心这里的constness),它保留了指向行的开头和结尾的指针.

我还希望能够分别遍历行和行内的元素:

matrix<double> m;
// fill m
for (row_view row : m) {
    for (double& elem : row) {
        // do something with elem
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,matrix<T>::iterator类(用于遍历行)在row_view rv;内部保持私有以跟踪迭代器指向的行.当然,iterator也实现了dereferenciation功能:

  • 因为operator*(),人们通常想要返回一个参考.相反,这里正确的做法似乎返回一个row_view值(即返回私有的副本row_view).这确保了当迭代器前进时,row_view静止指向前一行.(在某种程度上,row_view行为就像参考一样).
  • 因为operator->(),我不太确定.我看到两个选择:

    1. 返回指向row_view迭代器私有的指针:

      row_view* operator->() const { return &rv; }
      
      Run Code Online (Sandbox Code Playgroud)
    2. 返回指向新的指针row_view(私有指针的副本).由于存储生命周期,必须在堆上分配.为了确保清理,我将其包装成unique_ptr:

      std::unique_ptr<row_view> operator->() const {
          return std::unique_ptr<row_view>(new row_view(rv));
      }
      
      Run Code Online (Sandbox Code Playgroud)

显然,2更正确.如果迭代器 …

c++ containers iterator unique-ptr

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

STL矢量擦除通过指针

理解(至少我认为我这样做)指针可以用作随机STL迭代器.

除非我将指针强制转换为迭代器,否则为什么以下代码无法编译?

vector<int> v{1, 2, 3};
v.erase(&v[0]);
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl

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

如何在类中实现标准迭代器

我有一些类通常使用标准容器作为底层字段.例如,我有一个班级

template <typename T>
class Vec_3D
{
public:
    /* ... */
    std::array<T, 3> vec;
    /* ... */
};
Run Code Online (Sandbox Code Playgroud)

它只有一个变量vec,其余的只是我在处理矢量时需要的函数.我希望能够使用基于范围的for循环,例如

Vec_3D<double> vec;
for (double val : vec) {/*...*/}
Run Code Online (Sandbox Code Playgroud)

这应该是很容易迭代的std::array<double, 3>.

如何在我的类中实现迭代器,而这又应该调用迭代器std::array<T, 3>

我从这个问题开始,并尝试在我的类中定义迭代器

typedef std::iterator<std::random_access_iterator_tag, T, ptrdiff_t, T*, T&> iterator;
typedef std::iterator<std::random_access_iterator_tag, const T, ptrdiff_t, const T*, const T&> const_iterator;

inline iterator begin() noexcept { return vec.begin(); }
inline const_iterator cbegin() const noexcept { return vec.cbegin(); }
inline iterator end() noexcept { return …
Run Code Online (Sandbox Code Playgroud)

c++ iterator c++11

7
推荐指数
3
解决办法
9073
查看次数

使用迭代器中除最后一个元素之外的所有元素

我想将a Vec分成等长的部分,然后map覆盖它们.我有一个呼叫产生的迭代器Vecchunks()方法.这可能会让我的部分比其他部分小,这将是它产生的最后一个元素.

为了确保所有部分都具有相同的长度,我只想删除最后一个元素,然后调用map()左边的内容.

iterator rust

7
推荐指数
2
解决办法
2486
查看次数

如何将back_inserter与转换C++结合起来

如何包装OutputIterator,例如back_inserter_iterator转换?考虑

std::vector<double> xx;
std::vector<double> yy;
std::vector<double> diff;
auto ba = std::back_inserter(diff);
std::set_difference(xx.begin(), xx.end(), yy.begin(), yy.end(), ba);
Run Code Online (Sandbox Code Playgroud)

我想应用一个自由函数f(double)g(std::vector<double>::iterator)在推回到diff矢量之前:

具体来说,我如何存储diff元素(或迭代器)的地址而不是元素本身.

std::vector<double&> diff;
auto baAdr = ??? std::back_inserter( ??? (diff)); 
std::set_difference(xx.begin(), xx.end(), yy.begin(), yy.end(), baAdr);
Run Code Online (Sandbox Code Playgroud)

出于性能原因(真实数据很大),我不想构建一个临时向量std::transform.它也不适用于不可复制的可移动类型.

我可以用boost.

c++ boost iterator c++14

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