相关疑难解决方法(0)

如何建立STL迭代器平等?

我想知道,如何为STL迭代器建立等式(==)?它是一个简单的指针比较(因此基于地址)或更奇特的东西?

如果我有来自两个不同列表对象的两个迭代器并且我比较它们,结果总是为假?

如果我将有效值与超出范围的值进行比较,该怎么办?那总是假的吗?

c++ stl

11
推荐指数
1
解决办法
8000
查看次数

为什么将一个不存在的键应用于map :: find会返回一个迭代器,其中第一个值映射大小在C++中?

我有一个用例,如下面的代码片段,map::find在getter返回的map中使用,找到一个不存在的键实际上会找到一个迭代器,第一个值是map的大小(很可能),因此不会表现得如此,equals同map::end

这可能是因为我的地图是一个getter返回的地图.并且使用地图而不将其分配给变量.因此,getter返回值可能已被立即销毁.

  1. 如果我的猜测是正确的?
  2. 为什么它返回地图的大小而不是它的结束迭代器?

    #include <iostream>
    #include <map>


    class B {
        long long id_;

        public:
        B() = default;
        explicit B(long long);
        ~B() = default;
    };

    B::B(long long int id) : id_(id) {}


    class A {
        std::string id_;
        std::map<long long, std::shared_ptr<B>> b_;

        public:
        A() = default;
        explicit A(std::string id);
        ~A() = default;

        const std::string &id() const;

        std::map<long long, std::shared_ptr<B>> b();

    };

    A::A(std::string id): id_(id) {
        b_[1] = std::make_shared<B>(1);
        b_[2] = std::make_shared<B>(2);
    }

    const std::string &A::id() const {
        return …
Run Code Online (Sandbox Code Playgroud)

c++ dictionary stl

9
推荐指数
2
解决办法
118
查看次数

C/C++中原始指针和函数指针支持的操作是什么?

函数指针支持的所有操作与原始指针有什么不同?是>,<,<=,> =原始指针支持的运算符如果有,有什么用?

c c++ pointers function-pointers

6
推荐指数
1
解决办法
3302
查看次数

不是c ++中的迭代器是一种指针吗?

好的这次我决定使用STL制作一个列表.我需要为每个客户端创建一个专用的TCP套接字.所以每当我有一个连接时,我实例化一个套接字并在列表中添加一个指向它的指针.

list<MyTcp*> SocketList;  //This is the list of pointers to sockets
list<MyTcp*>::iterator it;  //An iterator to the list of pointers to TCP sockets.
Run Code Online (Sandbox Code Playgroud)

将一个新指针放到套接字很容易,但是现在每次连接结束时我应该断开套接字并删除指针,这样我就不会有大量的内存泄漏,对吧?好吧..我以为我做得好这个:

it=SocketList.begin();
while( it != SocketList.end() ){
    if((*it)->getClientId() == id){
    pSocket = it; //    <-------------- compiler complains at this line
    SocketList.remove(pSocket);
    pSocket->Disconnect();
    delete pSocket;
    break;
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译器这样说:

 error: invalid cast from type ‘std::_List_iterator<MyTcp*>’ to type ‘MyTcp*’
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?我以为我做的事情是对的,在任何给定的时间只是指向集合中的一个元素不是迭代器?我该怎么解决?

c++ pointers iterator list

5
推荐指数
2
解决办法
6818
查看次数

可以(重新)分配来自不同容器的迭代器吗?

无法比较来自不同容器的迭代器(例如,请参见此处:https : //stackoverflow.com/a/4664519/225186)(或者从技术上讲,它不需要有意义。)

这就提出了另一个问题,来自不同范围的迭代器可以相互分配吗?

Container A = ...;
Container B = ...;
auto it1 = A.begin();
it1 = B.begin(); // it1 first belonged to A, does it1 need to belong to B later 
Run Code Online (Sandbox Code Playgroud)

迭代器概念是否需要在某些标准或公认的实践或即将到来的标准范围内工作的最后一行?

由于相等和赋值是如此交织在一起,似乎如果相等 ( ==) 并不总是很好地定义,那么赋值 ( =) 也不需要很好地定义,并且可能出于类似的潜在原因。

我问的原因并不纯粹是学术性的,因为某个迭代器实现可能具有来自容器的一些“元数据”,并且(取决于实现)可能会或可能无法重新分配,或者只是重新分配的浪费。(例如,A 独有的步幅信息,与 B 的步幅信息不一致。另一个例子是迭代器存储对原始范围的引用时。)

这可以允许在尝试分配时,特定字段(成员)可能保持不变。在某些情况下可以使分配工作,这可能会产生较少的惊喜,但它也可能限制实现,问题是是否真的有必要定义/允许不同来源(出处)的迭代器之间的分配?


2021 年更新:

链接的文件内容如下:

[...] 术语 == 的域在普通数学意义上用于表示(需要)定义 == 的值集。这个集合可以随着时间的推移而改变。每个算法对其使用的迭代器值的 == 域都提出了额外的要求。这些要求可以从算法对 == 和 != 的使用中推断出来。

所以有一个隐式定义的(由算法) 的有效性范围== 。表述这个问题的另一种方式是,是否==可以通过简单的逻辑使用,对 的适用范围应用相同的警告=

潜在的想法是,==孤立地定义 …

c++ iterator range assignment-operator c++-concepts

5
推荐指数
1
解决办法
106
查看次数

std :: find的奇怪行为,当元素不在向量中时返回true

看起来很简单,std :: find的典型用法

for ( auto element : generic->vec() )
        LOG << element;

    LOG << channel;

    if ( !gen->vec().empty() ) {

        if(std::find(generic->vec().begin(), generic->vec().end(), channel) != generic->vec().end()){

            LOG << "Found";
            ;// Found the item
        } else {

            LOG << "Not Found";
            return false;

        }
}
Run Code Online (Sandbox Code Playgroud)

请检查日志文件

2018-11-08, 09:37:18 [INFO] - [140455150589696] - 1
2018-11-08, 09:37:18 [INFO] - [140455150589696] - 2
2018-11-08, 09:37:18 [INFO] - [140455150589696] - 4
2018-11-08, 09:37:18 [INFO] - [140455150589696] - 12
2018-11-08, 09:37:18 [INFO] - [140455150589696] - 40 …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

3
推荐指数
1
解决办法
128
查看次数

有没有办法迭代两个容器而不使用两个for循环

有没有办法迭代两个容器(一个跟随另一个),而不使用两个for循环.

我的意图是做这样的事情

vector<int> a{ 1,2,3 };
vector<int> b{ 4,5,6 };

auto it = a.begin();
auto end = b.end();

for (; it != end; ++it)
{
    if (it == a.end())
    {
        it = b.begin();
    }
    // do something with *it
}
Run Code Online (Sandbox Code Playgroud)

打印

1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)

(当然它不起作用.解释在这个答案中)

我不想写两个for循环并复制循环内的代码.有没有办法迭代a后跟b一个for循环?

我能想到的唯一的事情或者是拷贝/第二容器移动到第一或合并创建一个新的矢量ab,然后遍历它.我也不想这样做,因为这意味着昂贵的复制操作.

c++ c++11 c++14 c++17

3
推荐指数
1
解决办法
215
查看次数

使用带有c ++中的set的begin()和end()

我正在尝试使用迭代器来完成一个集合,然后对该集合的成员做一些事情(如果有的话).问题在于,通常这是有效的,但有时,它会比较空集的开头和结尾,并发现它们不相等.

感兴趣的代码段是:

    for(int i=0;i<input_data.num_particles();i++)
    {
        //loop through pairs contained in particle i's Verlet list
        set<int>::iterator iter;
        for(iter=verlet_vars.verlet()[i].begin();iter!=verlet_vars.verlet()[i].end();iter++)
        {
            //call the force() function to calculate the force between the particles
            force(particles.getpart(i),particles.getpart(*iter),input_data,*iter);  
        }
    }
Run Code Online (Sandbox Code Playgroud)

有时,即使verlet_vars.verlet()[i]中包含的集合为空,程序也会将迭代器与集合的末尾进行比较并发现它们不相等,因此它进入内部循环(最终导致程序崩溃)通过尝试调用force()函数).奇怪的是,如果我在调用内部循环之前对迭代器做了什么,比如做类似的事情:

iter=verlet_vars.verlet()[i].begin();
Run Code Online (Sandbox Code Playgroud)

然后,内部循环的比较总是返回true,程序正常运行.

PS命令verlet_vars.verlet()[i]调用集合的向量,因此[i]

verlet()函数:

std::vector<std::set<int> > verlet() const {return _verlet;}
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间.

c++ set stdvector stdset

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

在C++中迭代std :: set <std :: string>时出现分段错误

我的代码的这部分(对于这个项目)给了我一个分段错误.源代码可在此处获得.

void PackageManager::install_package(string pname)
{
  if(repository->exists_package(pname)) {
    Package *pkg;
    ConcretePackage *cpkg;
    MetaPackage *mpkg;
    if(repository->is_virtual(pname)) {
      //code for dealing with meta packages
      mpkg = new MetaPackage(pname);
      pkg = mpkg;
      system->operator+(pname);
    } else {
      //code for dealing with concrete packages
      cpkg = new ConcretePackage(pname);
      pkg = cpkg;
      system->operator+(pname);
      if( cpkg->getDependencies().size() > 0) {
        for(set<string>::iterator sit = pkg->getDependencies().begin();
            sit!=pkg->getDependencies().end(); ++sit) {
          cout<<*sit<<endl;
          system->operator+(*sit);
        }
      }
    }
  } else {
    cout<<"Invalid Package Name"<<endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我运行gdb和回溯时的错误.

Program received signal SIGSEGV, …
Run Code Online (Sandbox Code Playgroud)

c++ iterator set segmentation-fault

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